[tint] Implement subgroupAnd, Or, Xor builtins

Implement subgroupAnd, subgroupOr and subgroupXor builtin functions for
WGSL, SPIR-V IR, MSL (AST and IR) and HLSL (AST and IR) backends.

Skip expectations for Tint end2end tests have also been regenerated for all subgroup builtins for FXC.

Bug: 354738715
Change-Id: Ief085297c5d659faaf0c5f8893357fc92dccb21f
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/201695
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 1e9c846..e5ea4ce 100644
--- a/src/tint/cmd/fuzz/wgsl/dictionary.txt
+++ b/src/tint/cmd/fuzz/wgsl/dictionary.txt
@@ -368,11 +368,14 @@
 "storageBarrier"
 "struct"
 "subgroupAdd"
+"subgroupAnd"
 "subgroupBallot"
 "subgroupBroadcast"
 "subgroupExclusiveAdd"
 "subgroupExclusiveMul"
 "subgroupMul"
+"subgroupOr"
+"subgroupXor"
 "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 aaf8c76..30a98b4 100644
--- a/src/tint/lang/core/builtin_fn.cc
+++ b/src/tint/lang/core/builtin_fn.cc
@@ -417,6 +417,15 @@
     if (name == "subgroupExclusiveMul") {
         return BuiltinFn::kSubgroupExclusiveMul;
     }
+    if (name == "subgroupAnd") {
+        return BuiltinFn::kSubgroupAnd;
+    }
+    if (name == "subgroupOr") {
+        return BuiltinFn::kSubgroupOr;
+    }
+    if (name == "subgroupXor") {
+        return BuiltinFn::kSubgroupXor;
+    }
     return BuiltinFn::kNone;
 }
 
@@ -676,6 +685,12 @@
             return "subgroupMul";
         case BuiltinFn::kSubgroupExclusiveMul:
             return "subgroupExclusiveMul";
+        case BuiltinFn::kSubgroupAnd:
+            return "subgroupAnd";
+        case BuiltinFn::kSubgroupOr:
+            return "subgroupOr";
+        case BuiltinFn::kSubgroupXor:
+            return "subgroupXor";
     }
     return "<unknown>";
 }
diff --git a/src/tint/lang/core/builtin_fn.h b/src/tint/lang/core/builtin_fn.h
index 02e6396..f1c230d 100644
--- a/src/tint/lang/core/builtin_fn.h
+++ b/src/tint/lang/core/builtin_fn.h
@@ -173,6 +173,9 @@
     kSubgroupExclusiveAdd,
     kSubgroupMul,
     kSubgroupExclusiveMul,
+    kSubgroupAnd,
+    kSubgroupOr,
+    kSubgroupXor,
     kNone,
 };
 
@@ -321,6 +324,9 @@
     BuiltinFn::kSubgroupExclusiveAdd,
     BuiltinFn::kSubgroupMul,
     BuiltinFn::kSubgroupExclusiveMul,
+    BuiltinFn::kSubgroupAnd,
+    BuiltinFn::kSubgroupOr,
+    BuiltinFn::kSubgroupXor,
 };
 
 /// All builtin function names
@@ -451,6 +457,9 @@
     "subgroupExclusiveAdd",
     "subgroupMul",
     "subgroupExclusiveMul",
+    "subgroupAnd",
+    "subgroupOr",
+    "subgroupXor",
 };
 
 /// 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 8e5d7c2..dd40211 100644
--- a/src/tint/lang/core/core.def
+++ b/src/tint/lang/core/core.def
@@ -710,6 +710,12 @@
 @must_use @stage("fragment", "compute") fn subgroupMul[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
 @must_use @stage("fragment", "compute") fn subgroupExclusiveMul[T: fiu32_f16](value: T) -> T
 @must_use @stage("fragment", "compute") fn subgroupExclusiveMul[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("fragment", "compute") fn subgroupAnd[T: iu32](value: T) -> T
+@must_use @stage("fragment", "compute") fn subgroupAnd[N: num, T: iu32](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("fragment", "compute") fn subgroupOr[T: iu32](value: T) -> T
+@must_use @stage("fragment", "compute") fn subgroupOr[N: num, T: iu32](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("fragment", "compute") fn subgroupXor[T: iu32](value: T) -> T
+@must_use @stage("fragment", "compute") fn subgroupXor[N: num, T: iu32](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 d3072b5..51f5c73 100644
--- a/src/tint/lang/core/intrinsic/data.cc
+++ b/src/tint/lang/core/intrinsic/data.cc
@@ -8887,6 +8887,28 @@
   },
   {
     /* [409] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(28),
+    /* parameters */ ParameterIndex(350),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [410] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(27),
+    /* parameters */ ParameterIndex(352),
+    /* return_matcher_indices */ MatcherIndicesIndex(38),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [411] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -8897,7 +8919,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(81),
   },
   {
-    /* [410] */
+    /* [412] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -8908,7 +8930,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(81),
   },
   {
-    /* [411] */
+    /* [413] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -8919,40 +8941,40 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
-    /* [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(42),
+    /* parameters */ ParameterIndex(221),
+    /* return_matcher_indices */ MatcherIndicesIndex(44),
+    /* const_eval_fn */ ConstEvalFunctionIndex(82),
+  },
+  {
+    /* [415] */
+    /* 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),
+  },
+  {
+    /* [416] */
+    /* 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),
   },
   {
-    /* [415] */
+    /* [417] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -8963,7 +8985,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(92),
   },
   {
-    /* [416] */
+    /* [418] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -8974,28 +8996,6 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(92),
   },
   {
-    /* [417] */
-    /* 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),
-  },
-  {
-    /* [418] */
-    /* 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),
-  },
-  {
     /* [419] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
@@ -9004,7 +9004,7 @@
     /* templates */ TemplateIndex(32),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(43),
-    /* const_eval_fn */ ConstEvalFunctionIndex(98),
+    /* const_eval_fn */ ConstEvalFunctionIndex(97),
   },
   {
     /* [420] */
@@ -9015,7 +9015,7 @@
     /* templates */ TemplateIndex(32),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(156),
-    /* const_eval_fn */ ConstEvalFunctionIndex(98),
+    /* const_eval_fn */ ConstEvalFunctionIndex(97),
   },
   {
     /* [421] */
@@ -9023,10 +9023,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),
   },
   {
     /* [422] */
@@ -9034,10 +9034,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),
   },
   {
     /* [423] */
@@ -9048,7 +9048,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(43),
-    /* const_eval_fn */ ConstEvalFunctionIndex(100),
+    /* const_eval_fn */ ConstEvalFunctionIndex(99),
   },
   {
     /* [424] */
@@ -9059,7 +9059,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(156),
-    /* const_eval_fn */ ConstEvalFunctionIndex(100),
+    /* const_eval_fn */ ConstEvalFunctionIndex(99),
   },
   {
     /* [425] */
@@ -9070,7 +9070,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(43),
-    /* const_eval_fn */ ConstEvalFunctionIndex(101),
+    /* const_eval_fn */ ConstEvalFunctionIndex(100),
   },
   {
     /* [426] */
@@ -9081,7 +9081,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(156),
-    /* const_eval_fn */ ConstEvalFunctionIndex(101),
+    /* const_eval_fn */ ConstEvalFunctionIndex(100),
   },
   {
     /* [427] */
@@ -9092,7 +9092,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(43),
-    /* const_eval_fn */ ConstEvalFunctionIndex(102),
+    /* const_eval_fn */ ConstEvalFunctionIndex(101),
   },
   {
     /* [428] */
@@ -9103,7 +9103,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(156),
-    /* const_eval_fn */ ConstEvalFunctionIndex(102),
+    /* const_eval_fn */ ConstEvalFunctionIndex(101),
   },
   {
     /* [429] */
@@ -9111,10 +9111,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),
   },
   {
     /* [430] */
@@ -9122,10 +9122,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),
   },
   {
     /* [431] */
@@ -9136,7 +9136,7 @@
     /* templates */ TemplateIndex(28),
     /* parameters */ ParameterIndex(16),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(104),
+    /* const_eval_fn */ ConstEvalFunctionIndex(103),
   },
   {
     /* [432] */
@@ -9147,10 +9147,32 @@
     /* templates */ TemplateIndex(42),
     /* parameters */ ParameterIndex(356),
     /* return_matcher_indices */ MatcherIndicesIndex(44),
-    /* const_eval_fn */ ConstEvalFunctionIndex(104),
+    /* const_eval_fn */ ConstEvalFunctionIndex(103),
   },
   {
     /* [433] */
+    /* 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),
+  },
+  {
+    /* [434] */
+    /* 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),
+  },
+  {
+    /* [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(/* invalid */),
   },
   {
-    /* [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(17),
   },
   {
-    /* [435] */
+    /* [437] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9183,7 +9205,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(19),
   },
   {
-    /* [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(21),
   },
   {
-    /* [437] */
+    /* [439] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9205,7 +9227,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(22),
   },
   {
-    /* [438] */
+    /* [440] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9216,7 +9238,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(23),
   },
   {
-    /* [439] */
+    /* [441] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -9227,7 +9249,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(27),
   },
   {
-    /* [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(44),
   },
   {
-    /* [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(45),
   },
   {
-    /* [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(46),
   },
   {
-    /* [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(47),
   },
   {
-    /* [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(48),
   },
   {
-    /* [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(49),
   },
   {
-    /* [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(50),
   },
   {
-    /* [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(51),
   },
   {
-    /* [448] */
+    /* [450] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9326,7 +9348,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(52),
   },
   {
-    /* [449] */
+    /* [451] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9337,7 +9359,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(53),
   },
   {
-    /* [450] */
+    /* [452] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9348,7 +9370,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(57),
   },
   {
-    /* [451] */
+    /* [453] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -9359,7 +9381,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(58),
   },
   {
-    /* [452] */
+    /* [454] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 0,
     /* num_explicit_templates */ 0,
@@ -9370,7 +9392,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [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(72),
   },
   {
-    /* [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(74),
   },
   {
-    /* [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(75),
   },
   {
-    /* [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(76),
   },
   {
-    /* [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(77),
   },
   {
-    /* [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(78),
   },
   {
-    /* [459] */
+    /* [461] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9447,7 +9469,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(79),
   },
   {
-    /* [460] */
+    /* [462] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9458,7 +9480,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(80),
   },
   {
-    /* [461] */
+    /* [463] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9469,31 +9491,9 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [462] */
-    /* 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 */),
-  },
-  {
-    /* [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_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(28),
@@ -9504,6 +9504,28 @@
   {
     /* [465] */
     /* 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 */),
+  },
+  {
+    /* [466] */
+    /* 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 */),
+  },
+  {
+    /* [467] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
@@ -9513,7 +9535,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [466] */
+    /* [468] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9524,7 +9546,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [467] */
+    /* [469] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9535,7 +9557,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(95),
   },
   {
-    /* [468] */
+    /* [470] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9590,7 +9612,7 @@
     /* [5] */
     /* fn arrayLength[T, A : access](ptr<storage, array<T>, A>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(433),
+    /* overloads */ OverloadIndex(435),
   },
   {
     /* [6] */
@@ -9680,7 +9702,7 @@
     /* [18] */
     /* fn cross[T : f32_f16](vec3<T>, vec3<T>) -> vec3<T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(434),
+    /* overloads */ OverloadIndex(436),
   },
   {
     /* [19] */
@@ -9693,7 +9715,7 @@
     /* [20] */
     /* fn determinant[N : num, T : f32_f16](mat<N, N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(435),
+    /* overloads */ OverloadIndex(437),
   },
   {
     /* [21] */
@@ -9706,19 +9728,19 @@
     /* [22] */
     /* fn dot[N : num, T : fiu32_f16](vec<N, T>, vec<N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(436),
+    /* overloads */ OverloadIndex(438),
   },
   {
     /* [23] */
     /* fn dot4I8Packed(u32, u32) -> i32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(437),
+    /* overloads */ OverloadIndex(439),
   },
   {
     /* [24] */
     /* fn dot4U8Packed(u32, u32) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(438),
+    /* overloads */ OverloadIndex(440),
   },
   {
     /* [25] */
@@ -9787,7 +9809,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(439),
+    /* overloads */ OverloadIndex(441),
   },
   {
     /* [35] */
@@ -9927,61 +9949,61 @@
     /* [54] */
     /* fn normalize[N : num, T : f32_f16](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(440),
+    /* overloads */ OverloadIndex(442),
   },
   {
     /* [55] */
     /* fn pack2x16float(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(441),
+    /* overloads */ OverloadIndex(443),
   },
   {
     /* [56] */
     /* fn pack2x16snorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(442),
+    /* overloads */ OverloadIndex(444),
   },
   {
     /* [57] */
     /* fn pack2x16unorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(443),
+    /* overloads */ OverloadIndex(445),
   },
   {
     /* [58] */
     /* fn pack4x8snorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(444),
+    /* overloads */ OverloadIndex(446),
   },
   {
     /* [59] */
     /* fn pack4x8unorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(445),
+    /* overloads */ OverloadIndex(447),
   },
   {
     /* [60] */
     /* fn pack4xI8(vec4<i32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(446),
+    /* overloads */ OverloadIndex(448),
   },
   {
     /* [61] */
     /* fn pack4xU8(vec4<u32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(447),
+    /* overloads */ OverloadIndex(449),
   },
   {
     /* [62] */
     /* fn pack4xI8Clamp(vec4<i32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(448),
+    /* overloads */ OverloadIndex(450),
   },
   {
     /* [63] */
     /* fn pack4xU8Clamp(vec4<u32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(449),
+    /* overloads */ OverloadIndex(451),
   },
   {
     /* [64] */
@@ -10008,13 +10030,13 @@
     /* [67] */
     /* fn reflect[N : num, T : f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(450),
+    /* overloads */ OverloadIndex(452),
   },
   {
     /* [68] */
     /* fn refract[N : num, T : f32_f16](vec<N, T>, vec<N, T>, T) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(451),
+    /* overloads */ OverloadIndex(453),
   },
   {
     /* [69] */
@@ -10091,7 +10113,7 @@
     /* [79] */
     /* fn storageBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(452),
+    /* overloads */ OverloadIndex(454),
   },
   {
     /* [80] */
@@ -10111,7 +10133,7 @@
     /* [82] */
     /* fn transpose[M : num, N : num, T : f32_f16](mat<M, N, T>) -> mat<N, M, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(453),
+    /* overloads */ OverloadIndex(455),
   },
   {
     /* [83] */
@@ -10124,55 +10146,55 @@
     /* [84] */
     /* fn unpack2x16float(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(454),
+    /* overloads */ OverloadIndex(456),
   },
   {
     /* [85] */
     /* fn unpack2x16snorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(455),
+    /* overloads */ OverloadIndex(457),
   },
   {
     /* [86] */
     /* fn unpack2x16unorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(456),
+    /* overloads */ OverloadIndex(458),
   },
   {
     /* [87] */
     /* fn unpack4x8snorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(457),
+    /* overloads */ OverloadIndex(459),
   },
   {
     /* [88] */
     /* fn unpack4x8unorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(458),
+    /* overloads */ OverloadIndex(460),
   },
   {
     /* [89] */
     /* fn unpack4xI8(u32) -> vec4<i32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(459),
+    /* overloads */ OverloadIndex(461),
   },
   {
     /* [90] */
     /* fn unpack4xU8(u32) -> vec4<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(460),
+    /* overloads */ OverloadIndex(462),
   },
   {
     /* [91] */
     /* fn workgroupBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(452),
+    /* overloads */ OverloadIndex(454),
   },
   {
     /* [92] */
     /* fn textureBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(452),
+    /* overloads */ OverloadIndex(454),
   },
   {
     /* [93] */
@@ -10407,79 +10429,79 @@
     /* [108] */
     /* fn inputAttachmentLoad[T : fiu32](input_attachment: input_attachment<T>) -> vec4<T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(461),
+    /* overloads */ OverloadIndex(463),
   },
   {
     /* [109] */
     /* fn atomicLoad[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(462),
+    /* overloads */ OverloadIndex(464),
   },
   {
     /* [110] */
     /* fn atomicStore[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(463),
+    /* overloads */ OverloadIndex(465),
   },
   {
     /* [111] */
     /* fn atomicAdd[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(464),
+    /* overloads */ OverloadIndex(466),
   },
   {
     /* [112] */
     /* fn atomicSub[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(464),
+    /* overloads */ OverloadIndex(466),
   },
   {
     /* [113] */
     /* fn atomicMax[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(464),
+    /* overloads */ OverloadIndex(466),
   },
   {
     /* [114] */
     /* fn atomicMin[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(464),
+    /* overloads */ OverloadIndex(466),
   },
   {
     /* [115] */
     /* fn atomicAnd[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(464),
+    /* overloads */ OverloadIndex(466),
   },
   {
     /* [116] */
     /* fn atomicOr[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(464),
+    /* overloads */ OverloadIndex(466),
   },
   {
     /* [117] */
     /* fn atomicXor[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(464),
+    /* overloads */ OverloadIndex(466),
   },
   {
     /* [118] */
     /* fn atomicExchange[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(464),
+    /* overloads */ OverloadIndex(466),
   },
   {
     /* [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(465),
+    /* overloads */ OverloadIndex(467),
   },
   {
     /* [120] */
     /* fn subgroupBallot(bool) -> vec4<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(466),
+    /* overloads */ OverloadIndex(468),
   },
   {
     /* [121] */
@@ -10516,6 +10538,27 @@
     /* num overloads */ 2,
     /* overloads */ OverloadIndex(407),
   },
+  {
+    /* [126] */
+    /* fn subgroupAnd[T : iu32](value: T) -> T */
+    /* fn subgroupAnd[N : num, T : iu32](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(409),
+  },
+  {
+    /* [127] */
+    /* fn subgroupOr[T : iu32](value: T) -> T */
+    /* fn subgroupOr[N : num, T : iu32](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(409),
+  },
+  {
+    /* [128] */
+    /* fn subgroupXor[T : iu32](value: T) -> T */
+    /* fn subgroupXor[N : num, T : iu32](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(409),
+  },
 };
 
 constexpr IntrinsicInfo kUnaryOperators[] = {
@@ -10524,21 +10567,21 @@
     /* op !(bool) -> bool */
     /* op ![N : num](vec<N, bool>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(409),
+    /* overloads */ OverloadIndex(411),
   },
   {
     /* [1] */
     /* op ~[T : iu32](T) -> T */
     /* op ~[T : iu32, N : num](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(411),
+    /* overloads */ OverloadIndex(413),
   },
   {
     /* [2] */
     /* op -[T : fi32_f16](T) -> T */
     /* op -[T : fi32_f16, N : num](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(413),
+    /* overloads */ OverloadIndex(415),
   },
 };
 constexpr uint8_t kUnaryOperatorNot = 0;
@@ -10603,7 +10646,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(415),
+    /* overloads */ OverloadIndex(417),
   },
   {
     /* [6] */
@@ -10627,69 +10670,69 @@
     /* [8] */
     /* op &&(bool, bool) -> bool */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(467),
+    /* overloads */ OverloadIndex(469),
   },
   {
     /* [9] */
     /* op ||(bool, bool) -> bool */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(468),
+    /* overloads */ OverloadIndex(470),
   },
   {
     /* [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(417),
+    /* overloads */ OverloadIndex(419),
   },
   {
     /* [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(419),
+    /* overloads */ OverloadIndex(421),
   },
   {
     /* [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(421),
+    /* overloads */ OverloadIndex(423),
   },
   {
     /* [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(423),
+    /* overloads */ OverloadIndex(425),
   },
   {
     /* [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(425),
+    /* overloads */ OverloadIndex(427),
   },
   {
     /* [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(427),
+    /* overloads */ OverloadIndex(429),
   },
   {
     /* [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(429),
+    /* overloads */ OverloadIndex(431),
   },
   {
     /* [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(431),
+    /* overloads */ OverloadIndex(433),
   },
 };
 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 bc43946..30c2447 100644
--- a/src/tint/lang/core/ir/binary/decode.cc
+++ b/src/tint/lang/core/ir/binary/decode.cc
@@ -1637,6 +1637,12 @@
                 return core::BuiltinFn::kSubgroupMul;
             case pb::BuiltinFn::subgroup_exclusive_mul:
                 return core::BuiltinFn::kSubgroupExclusiveMul;
+            case pb::BuiltinFn::subgroup_and:
+                return core::BuiltinFn::kSubgroupAnd;
+            case pb::BuiltinFn::subgroup_or:
+                return core::BuiltinFn::kSubgroupOr;
+            case pb::BuiltinFn::subgroup_xor:
+                return core::BuiltinFn::kSubgroupXor;
 
             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 e6ce605..af0b13c 100644
--- a/src/tint/lang/core/ir/binary/encode.cc
+++ b/src/tint/lang/core/ir/binary/encode.cc
@@ -1149,6 +1149,12 @@
                 return pb::BuiltinFn::subgroup_mul;
             case core::BuiltinFn::kSubgroupExclusiveMul:
                 return pb::BuiltinFn::subgroup_exclusive_mul;
+            case core::BuiltinFn::kSubgroupAnd:
+                return pb::BuiltinFn::subgroup_and;
+            case core::BuiltinFn::kSubgroupOr:
+                return pb::BuiltinFn::subgroup_or;
+            case core::BuiltinFn::kSubgroupXor:
+                return pb::BuiltinFn::subgroup_xor;
             case core::BuiltinFn::kNone:
                 break;
         }
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
index a67cceb..cd9c3d9 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -1263,12 +1263,36 @@
         return false;
     }
 
-    // Handle single argument builtins that only accept and return uint (not int overload). We need
-    // to explicitly cast the return value (we also cast the arg for good measure). See
-    // crbug.com/tint/1550
-    if (type == wgsl::BuiltinFn::kCountOneBits || type == wgsl::BuiltinFn::kReverseBits) {
+    // Handle single argument builtins that only accept and return uint (not int overload).
+    // For count bits and reverse bits, we need to explicitly cast the return value (we also cast
+    // the arg for good measure). See crbug.com/tint/1550.
+    // For the following subgroup builtins, the lack of support may be a bug in DXC. See
+    // github.com/microsoft/DirectXShaderCompiler/issues/6850.
+    if (type == wgsl::BuiltinFn::kCountOneBits || type == wgsl::BuiltinFn::kReverseBits ||
+        type == wgsl::BuiltinFn::kSubgroupAnd || type == wgsl::BuiltinFn::kSubgroupOr ||
+        type == wgsl::BuiltinFn::kSubgroupXor) {
         auto* arg = call->Arguments()[0];
-        if (arg->Type()->UnwrapRef()->is_signed_integer_scalar_or_vector()) {
+        auto* argType = arg->Type()->UnwrapRef();
+        if (argType->is_signed_integer_scalar_or_vector()) {
+            // Bitcast of literal int vectors fails in DXC so extract arg to a var. See
+            // github.com/microsoft/DirectXShaderCompiler/issues/6851.
+            if (argType->is_signed_integer_vector() &&
+                arg->Stage() == core::EvaluationStage::kConstant) {
+                auto varName = UniqueIdentifier(kTempNamePrefix);
+                auto pre = Line();
+                if (!EmitTypeAndName(pre, argType, core::AddressSpace::kUndefined,
+                                     core::Access::kUndefined, varName)) {
+                    return false;
+                }
+                pre << " = ";
+                if (!EmitExpression(pre, arg->Declaration())) {
+                    return false;
+                }
+                pre << ";";
+                out << "asint(" << name << "(asuint(" << varName << ")))";
+                return true;
+            }
+
             out << "asint(" << name << "(asuint(";
             if (!EmitExpression(out, arg->Declaration())) {
                 return false;
@@ -3082,6 +3106,12 @@
             return "WaveActiveProduct";
         case wgsl::BuiltinFn::kSubgroupExclusiveMul:
             return "WavePrefixProduct";
+        case wgsl::BuiltinFn::kSubgroupAnd:
+            return "WaveActiveBitAnd";
+        case wgsl::BuiltinFn::kSubgroupOr:
+            return "WaveActiveBitOr";
+        case wgsl::BuiltinFn::kSubgroupXor:
+            return "WaveActiveBitXor";
         default:
             diagnostics_.AddError(Source{}) << "Unknown builtin method: " << builtin->str();
     }
diff --git a/src/tint/lang/hlsl/writer/printer/printer.cc b/src/tint/lang/hlsl/writer/printer/printer.cc
index 15d640c..ccda7e0 100644
--- a/src/tint/lang/hlsl/writer/printer/printer.cc
+++ b/src/tint/lang/hlsl/writer/printer/printer.cc
@@ -1017,7 +1017,15 @@
             case core::BuiltinFn::kSubgroupExclusiveMul:
                 out << "WavePrefixProduct";
                 break;
-
+            case core::BuiltinFn::kSubgroupAnd:
+                out << "WaveActiveBitAnd";
+                break;
+            case core::BuiltinFn::kSubgroupOr:
+                out << "WaveActiveBitOr";
+                break;
+            case core::BuiltinFn::kSubgroupXor:
+                out << "WaveActiveBitXor";
+                break;
             default:
                 TINT_UNREACHABLE() << "unhandled: " << func;
         }
diff --git a/src/tint/lang/hlsl/writer/raise/builtin_polyfill.cc b/src/tint/lang/hlsl/writer/raise/builtin_polyfill.cc
index 2796ee5..742702c 100644
--- a/src/tint/lang/hlsl/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/hlsl/writer/raise/builtin_polyfill.cc
@@ -116,6 +116,9 @@
                     case core::BuiltinFn::kReverseBits:
                     case core::BuiltinFn::kSelect:
                     case core::BuiltinFn::kSign:
+                    case core::BuiltinFn::kSubgroupAnd:
+                    case core::BuiltinFn::kSubgroupOr:
+                    case core::BuiltinFn::kSubgroupXor:
                     case core::BuiltinFn::kTextureDimensions:
                     case core::BuiltinFn::kTextureGather:
                     case core::BuiltinFn::kTextureGatherCompare:
@@ -254,6 +257,11 @@
                 case core::BuiltinFn::kSign:
                     Sign(call);
                     break;
+                case core::BuiltinFn::kSubgroupAnd:
+                case core::BuiltinFn::kSubgroupOr:
+                case core::BuiltinFn::kSubgroupXor:
+                    BitcastToIntOverloadCall(call);
+                    break;
                 case core::BuiltinFn::kTextureDimensions:
                     TextureDimensions(call);
                     break;
@@ -1714,12 +1722,19 @@
     void BitcastToIntOverloadCall(core::ir::CoreBuiltinCall* call) {
         TINT_ASSERT(call->Args().Length() == 1);
         auto* arg = call->Args()[0];
-        if (arg->Type()->UnwrapRef()->is_signed_integer_scalar_or_vector()) {
+        auto* arg_type = arg->Type()->UnwrapRef();
+        if (arg_type->is_signed_integer_scalar_or_vector()) {
             auto* result_ty = call->Result(0)->Type();
             auto* u32_type = ty.match_width(ty.u32(), result_ty);
             b.InsertBefore(call, [&] {
+                core::ir::Value* val = arg;
+                // Bitcast of literal int vectors fails in DXC so extract arg to a var. See
+                // github.com/microsoft/DirectXShaderCompiler/issues/6851.
+                if (arg_type->is_signed_integer_vector() && arg->Is<core::ir::Constant>()) {
+                    val = b.Let("arg", arg)->Result(0);
+                }
                 auto* inner =
-                    b.Call<hlsl::ir::BuiltinCall>(u32_type, hlsl::BuiltinFn::kAsuint, arg);
+                    b.Call<hlsl::ir::BuiltinCall>(u32_type, hlsl::BuiltinFn::kAsuint, val);
                 auto* func = b.Call(u32_type, call->Func(), inner);
                 b.CallWithResult<hlsl::ir::BuiltinCall>(call->DetachResult(),
                                                         hlsl::BuiltinFn::kAsint, func);
diff --git a/src/tint/lang/hlsl/writer/raise/builtin_polyfill_test.cc b/src/tint/lang/hlsl/writer/raise/builtin_polyfill_test.cc
index 6dac993..f2ffe16 100644
--- a/src/tint/lang/hlsl/writer/raise/builtin_polyfill_test.cc
+++ b/src/tint/lang/hlsl/writer/raise/builtin_polyfill_test.cc
@@ -6923,5 +6923,40 @@
     EXPECT_EQ(expect, str());
 }
 
+TEST_F(HlslWriter_BuiltinPolyfillTest, SubgroupAndLiteralVec) {
+    auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
+    b.Append(func->Block(), [&] {
+        b.Let("a", b.Call(ty.vec3<i32>(), core::BuiltinFn::kSubgroupAnd,
+                          b.Composite(ty.vec3<i32>(), 1_i, 1_i, 1_i)));
+        b.Return(func);
+    });
+
+    auto* src = R"(
+%foo = @fragment func():void {
+  $B1: {
+    %2:vec3<i32> = subgroupAnd vec3<i32>(1i)
+    %a:vec3<i32> = let %2
+    ret
+  }
+}
+)";
+    ASSERT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = @fragment func():void {
+  $B1: {
+    %arg:vec3<i32> = let vec3<i32>(1i)
+    %3:vec3<u32> = hlsl.asuint %arg
+    %4:vec3<u32> = subgroupAnd %3
+    %5:vec3<i32> = hlsl.asint %4
+    %a:vec3<i32> = let %5
+    ret
+  }
+}
+)";
+    Run(BuiltinPolyfill);
+    EXPECT_EQ(expect, str());
+}
+
 }  // namespace
 }  // namespace tint::hlsl::writer::raise
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index e4b7a10..784adf8 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -841,6 +841,33 @@
             return true;
         }
 
+        case wgsl::BuiltinFn::kSubgroupAnd: {
+            out << "simd_and(";
+            if (!EmitExpression(out, expr->args[0])) {
+                return false;
+            }
+            out << ")";
+            return true;
+        }
+
+        case wgsl::BuiltinFn::kSubgroupOr: {
+            out << "simd_or(";
+            if (!EmitExpression(out, expr->args[0])) {
+                return false;
+            }
+            out << ")";
+            return true;
+        }
+
+        case wgsl::BuiltinFn::kSubgroupXor: {
+            out << "simd_xor(";
+            if (!EmitExpression(out, expr->args[0])) {
+                return false;
+            }
+            out << ")";
+            return true;
+        }
+
         default:
             break;
     }
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index a36dd02..1ba5fd7 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -991,6 +991,15 @@
             case core::BuiltinFn::kSubgroupExclusiveMul:
                 out << "simd_prefix_exclusive_product";
                 break;
+            case core::BuiltinFn::kSubgroupAnd:
+                out << "simd_and";
+                break;
+            case core::BuiltinFn::kSubgroupOr:
+                out << "simd_or";
+                break;
+            case core::BuiltinFn::kSubgroupXor:
+                out << "simd_xor";
+                break;
             case core::BuiltinFn::kInverseSqrt:
                 out << "rsqrt";
                 break;
diff --git a/src/tint/lang/spirv/writer/ast_printer/builder.cc b/src/tint/lang/spirv/writer/ast_printer/builder.cc
index 0b46db8..45de8ff 100644
--- a/src/tint/lang/spirv/writer/ast_printer/builder.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/builder.cc
@@ -2568,9 +2568,12 @@
         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.
+        case wgsl::BuiltinFn::kSubgroupExclusiveMul:
+        case wgsl::BuiltinFn::kSubgroupAnd:
+        case wgsl::BuiltinFn::kSubgroupOr:
+        case wgsl::BuiltinFn::kSubgroupXor: {
+            // This file should be removed soon with the SPIR-V AST backend, but in the meantime we
+            // need this explicit failure to avoid a new ICE that can get caught by the fuzzers.
             return 0;
         }
         default: {
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index a728558..a31e264 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -1686,6 +1686,24 @@
                 op = spv::Op::OpGroupNonUniformBroadcast;
                 operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
                 break;
+            case core::BuiltinFn::kSubgroupAnd:
+                module_.PushCapability(SpvCapabilityGroupNonUniformArithmetic);
+                op = spv::Op::OpGroupNonUniformBitwiseAnd;
+                operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
+                operands.push_back(U32Operand(u32(spv::GroupOperation::Reduce)));
+                break;
+            case core::BuiltinFn::kSubgroupOr:
+                module_.PushCapability(SpvCapabilityGroupNonUniformArithmetic);
+                op = spv::Op::OpGroupNonUniformBitwiseOr;
+                operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
+                operands.push_back(U32Operand(u32(spv::GroupOperation::Reduce)));
+                break;
+            case core::BuiltinFn::kSubgroupXor:
+                module_.PushCapability(SpvCapabilityGroupNonUniformArithmetic);
+                op = spv::Op::OpGroupNonUniformBitwiseXor;
+                operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
+                operands.push_back(U32Operand(u32(spv::GroupOperation::Reduce)));
+                break;
             case core::BuiltinFn::kTan:
                 glsl_ext_inst(GLSLstd450Tan);
                 break;
diff --git a/src/tint/lang/wgsl/builtin_fn.cc b/src/tint/lang/wgsl/builtin_fn.cc
index 26bf650..1bad377 100644
--- a/src/tint/lang/wgsl/builtin_fn.cc
+++ b/src/tint/lang/wgsl/builtin_fn.cc
@@ -423,6 +423,15 @@
     if (name == "subgroupExclusiveMul") {
         return BuiltinFn::kSubgroupExclusiveMul;
     }
+    if (name == "subgroupAnd") {
+        return BuiltinFn::kSubgroupAnd;
+    }
+    if (name == "subgroupOr") {
+        return BuiltinFn::kSubgroupOr;
+    }
+    if (name == "subgroupXor") {
+        return BuiltinFn::kSubgroupXor;
+    }
     if (name == "__tint_materialize") {
         return BuiltinFn::kTintMaterialize;
     }
@@ -689,6 +698,12 @@
             return "subgroupMul";
         case BuiltinFn::kSubgroupExclusiveMul:
             return "subgroupExclusiveMul";
+        case BuiltinFn::kSubgroupAnd:
+            return "subgroupAnd";
+        case BuiltinFn::kSubgroupOr:
+            return "subgroupOr";
+        case BuiltinFn::kSubgroupXor:
+            return "subgroupXor";
         case BuiltinFn::kTintMaterialize:
             return "__tint_materialize";
     }
@@ -769,6 +784,9 @@
         case BuiltinFn::kSubgroupExclusiveAdd:
         case BuiltinFn::kSubgroupMul:
         case BuiltinFn::kSubgroupExclusiveMul:
+        case BuiltinFn::kSubgroupAnd:
+        case BuiltinFn::kSubgroupOr:
+        case BuiltinFn::kSubgroupXor:
             return true;
         default:
             return false;
diff --git a/src/tint/lang/wgsl/builtin_fn.cc.tmpl b/src/tint/lang/wgsl/builtin_fn.cc.tmpl
index 4abe603..40a07f4 100644
--- a/src/tint/lang/wgsl/builtin_fn.cc.tmpl
+++ b/src/tint/lang/wgsl/builtin_fn.cc.tmpl
@@ -115,6 +115,9 @@
         case BuiltinFn::kSubgroupExclusiveAdd:
         case BuiltinFn::kSubgroupMul:
         case BuiltinFn::kSubgroupExclusiveMul:
+        case BuiltinFn::kSubgroupAnd:
+        case BuiltinFn::kSubgroupOr:
+        case BuiltinFn::kSubgroupXor:
             return true;
         default:
             return false;
diff --git a/src/tint/lang/wgsl/builtin_fn.h b/src/tint/lang/wgsl/builtin_fn.h
index da9de21..16f48aa 100644
--- a/src/tint/lang/wgsl/builtin_fn.h
+++ b/src/tint/lang/wgsl/builtin_fn.h
@@ -175,6 +175,9 @@
     kSubgroupExclusiveAdd,
     kSubgroupMul,
     kSubgroupExclusiveMul,
+    kSubgroupAnd,
+    kSubgroupOr,
+    kSubgroupXor,
     kTintMaterialize,
     kNone,
 };
@@ -326,6 +329,9 @@
     BuiltinFn::kSubgroupExclusiveAdd,
     BuiltinFn::kSubgroupMul,
     BuiltinFn::kSubgroupExclusiveMul,
+    BuiltinFn::kSubgroupAnd,
+    BuiltinFn::kSubgroupOr,
+    BuiltinFn::kSubgroupXor,
     BuiltinFn::kTintMaterialize,
 };
 
@@ -459,6 +465,9 @@
     "subgroupExclusiveAdd",
     "subgroupMul",
     "subgroupExclusiveMul",
+    "subgroupAnd",
+    "subgroupOr",
+    "subgroupXor",
     "__tint_materialize",
 };
 
diff --git a/src/tint/lang/wgsl/intrinsic/data.cc b/src/tint/lang/wgsl/intrinsic/data.cc
index de00c10..b049e9b 100644
--- a/src/tint/lang/wgsl/intrinsic/data.cc
+++ b/src/tint/lang/wgsl/intrinsic/data.cc
@@ -10333,6 +10333,28 @@
   },
   {
     /* [485] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(72),
+    /* parameters */ ParameterIndex(323),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [486] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(71),
+    /* parameters */ ParameterIndex(325),
+    /* return_matcher_indices */ MatcherIndicesIndex(50),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [487] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10343,7 +10365,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(83),
   },
   {
-    /* [486] */
+    /* [488] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10354,37 +10376,15 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(83),
   },
   {
-    /* [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(99),
-    /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(84),
-  },
-  {
-    /* [488] */
-    /* 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),
-  },
-  {
     /* [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),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(85),
+    /* const_eval_fn */ ConstEvalFunctionIndex(84),
   },
   {
     /* [490] */
@@ -10392,13 +10392,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),
+  },
+  {
+    /* [491] */
+    /* 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),
+  },
+  {
+    /* [492] */
+    /* 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),
   },
   {
-    /* [491] */
+    /* [493] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10409,7 +10431,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(94),
   },
   {
-    /* [492] */
+    /* [494] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10420,28 +10442,6 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(94),
   },
   {
-    /* [493] */
-    /* 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),
-  },
-  {
-    /* [494] */
-    /* 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),
-  },
-  {
     /* [495] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
@@ -10450,7 +10450,7 @@
     /* templates */ TemplateIndex(82),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(55),
-    /* const_eval_fn */ ConstEvalFunctionIndex(100),
+    /* const_eval_fn */ ConstEvalFunctionIndex(99),
   },
   {
     /* [496] */
@@ -10461,7 +10461,7 @@
     /* templates */ TemplateIndex(82),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(113),
-    /* const_eval_fn */ ConstEvalFunctionIndex(100),
+    /* const_eval_fn */ ConstEvalFunctionIndex(99),
   },
   {
     /* [497] */
@@ -10469,10 +10469,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),
   },
   {
     /* [498] */
@@ -10480,10 +10480,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),
   },
   {
     /* [499] */
@@ -10494,7 +10494,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(55),
-    /* const_eval_fn */ ConstEvalFunctionIndex(102),
+    /* const_eval_fn */ ConstEvalFunctionIndex(101),
   },
   {
     /* [500] */
@@ -10505,7 +10505,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(113),
-    /* const_eval_fn */ ConstEvalFunctionIndex(102),
+    /* const_eval_fn */ ConstEvalFunctionIndex(101),
   },
   {
     /* [501] */
@@ -10516,7 +10516,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(55),
-    /* const_eval_fn */ ConstEvalFunctionIndex(103),
+    /* const_eval_fn */ ConstEvalFunctionIndex(102),
   },
   {
     /* [502] */
@@ -10527,7 +10527,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(113),
-    /* const_eval_fn */ ConstEvalFunctionIndex(103),
+    /* const_eval_fn */ ConstEvalFunctionIndex(102),
   },
   {
     /* [503] */
@@ -10538,7 +10538,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(55),
-    /* const_eval_fn */ ConstEvalFunctionIndex(104),
+    /* const_eval_fn */ ConstEvalFunctionIndex(103),
   },
   {
     /* [504] */
@@ -10549,7 +10549,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(113),
-    /* const_eval_fn */ ConstEvalFunctionIndex(104),
+    /* const_eval_fn */ ConstEvalFunctionIndex(103),
   },
   {
     /* [505] */
@@ -10557,10 +10557,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),
   },
   {
     /* [506] */
@@ -10568,10 +10568,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),
   },
   {
     /* [507] */
@@ -10582,7 +10582,7 @@
     /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(16),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(106),
+    /* const_eval_fn */ ConstEvalFunctionIndex(105),
   },
   {
     /* [508] */
@@ -10593,10 +10593,32 @@
     /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(329),
     /* return_matcher_indices */ MatcherIndicesIndex(56),
-    /* const_eval_fn */ ConstEvalFunctionIndex(106),
+    /* const_eval_fn */ ConstEvalFunctionIndex(105),
   },
   {
     /* [509] */
+    /* 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),
+  },
+  {
+    /* [510] */
+    /* 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),
+  },
+  {
+    /* [511] */
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
@@ -10607,7 +10629,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
-    /* [510] */
+    /* [512] */
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10618,7 +10640,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
-    /* [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(18),
   },
   {
-    /* [512] */
+    /* [514] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10640,7 +10662,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(20),
   },
   {
-    /* [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(22),
   },
   {
-    /* [514] */
+    /* [516] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10662,7 +10684,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(23),
   },
   {
-    /* [515] */
+    /* [517] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10673,7 +10695,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(24),
   },
   {
-    /* [516] */
+    /* [518] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -10684,7 +10706,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(28),
   },
   {
-    /* [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(45),
   },
   {
-    /* [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(46),
   },
   {
-    /* [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(47),
   },
   {
-    /* [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(48),
   },
   {
-    /* [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(49),
   },
   {
-    /* [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(50),
   },
   {
-    /* [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(51),
   },
   {
-    /* [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(52),
   },
   {
-    /* [525] */
+    /* [527] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10783,7 +10805,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(53),
   },
   {
-    /* [526] */
+    /* [528] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10794,7 +10816,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(54),
   },
   {
-    /* [527] */
+    /* [529] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10805,7 +10827,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(58),
   },
   {
-    /* [528] */
+    /* [530] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -10816,7 +10838,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(59),
   },
   {
-    /* [529] */
+    /* [531] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 0,
     /* num_explicit_templates */ 0,
@@ -10827,7 +10849,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [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(73),
   },
   {
-    /* [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(75),
   },
   {
-    /* [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(76),
   },
   {
-    /* [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(77),
   },
   {
-    /* [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(78),
   },
   {
-    /* [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(79),
   },
   {
-    /* [536] */
+    /* [538] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10904,7 +10926,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(80),
   },
   {
-    /* [537] */
+    /* [539] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10915,7 +10937,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(81),
   },
   {
-    /* [538] */
+    /* [540] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10926,7 +10948,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [539] */
+    /* [541] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10937,31 +10959,9 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [540] */
-    /* 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 */),
-  },
-  {
-    /* [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_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(72),
@@ -10972,6 +10972,28 @@
   {
     /* [543] */
     /* 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 */),
+  },
+  {
+    /* [544] */
+    /* 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 */),
+  },
+  {
+    /* [545] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
@@ -10981,7 +11003,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [544] */
+    /* [546] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, 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::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -11003,7 +11025,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
-    /* [546] */
+    /* [548] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -11014,7 +11036,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [547] */
+    /* [549] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -11025,7 +11047,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [548] */
+    /* [550] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -11036,7 +11058,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(97),
   },
   {
-    /* [549] */
+    /* [551] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -11197,7 +11219,7 @@
     /* [19] */
     /* fn cross[T : fa_f32_f16](vec3<T>, vec3<T>) -> vec3<T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(511),
+    /* overloads */ OverloadIndex(513),
   },
   {
     /* [20] */
@@ -11210,7 +11232,7 @@
     /* [21] */
     /* fn determinant[N : num, T : fa_f32_f16](mat<N, N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(512),
+    /* overloads */ OverloadIndex(514),
   },
   {
     /* [22] */
@@ -11223,19 +11245,19 @@
     /* [23] */
     /* fn dot[N : num, T : fia_fiu32_f16](vec<N, T>, vec<N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(513),
+    /* overloads */ OverloadIndex(515),
   },
   {
     /* [24] */
     /* fn dot4I8Packed(u32, u32) -> i32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(514),
+    /* overloads */ OverloadIndex(516),
   },
   {
     /* [25] */
     /* fn dot4U8Packed(u32, u32) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(515),
+    /* overloads */ OverloadIndex(517),
   },
   {
     /* [26] */
@@ -11304,7 +11326,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(516),
+    /* overloads */ OverloadIndex(518),
   },
   {
     /* [36] */
@@ -11444,61 +11466,61 @@
     /* [55] */
     /* fn normalize[N : num, T : fa_f32_f16](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(517),
+    /* overloads */ OverloadIndex(519),
   },
   {
     /* [56] */
     /* fn pack2x16float(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(518),
+    /* overloads */ OverloadIndex(520),
   },
   {
     /* [57] */
     /* fn pack2x16snorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(519),
+    /* overloads */ OverloadIndex(521),
   },
   {
     /* [58] */
     /* fn pack2x16unorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(520),
+    /* overloads */ OverloadIndex(522),
   },
   {
     /* [59] */
     /* fn pack4x8snorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(521),
+    /* overloads */ OverloadIndex(523),
   },
   {
     /* [60] */
     /* fn pack4x8unorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(522),
+    /* overloads */ OverloadIndex(524),
   },
   {
     /* [61] */
     /* fn pack4xI8(vec4<i32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(523),
+    /* overloads */ OverloadIndex(525),
   },
   {
     /* [62] */
     /* fn pack4xU8(vec4<u32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(524),
+    /* overloads */ OverloadIndex(526),
   },
   {
     /* [63] */
     /* fn pack4xI8Clamp(vec4<i32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(525),
+    /* overloads */ OverloadIndex(527),
   },
   {
     /* [64] */
     /* fn pack4xU8Clamp(vec4<u32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(526),
+    /* overloads */ OverloadIndex(528),
   },
   {
     /* [65] */
@@ -11525,13 +11547,13 @@
     /* [68] */
     /* fn reflect[N : num, T : fa_f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(527),
+    /* overloads */ OverloadIndex(529),
   },
   {
     /* [69] */
     /* fn refract[N : num, T : fa_f32_f16](vec<N, T>, vec<N, T>, T) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(528),
+    /* overloads */ OverloadIndex(530),
   },
   {
     /* [70] */
@@ -11608,7 +11630,7 @@
     /* [80] */
     /* fn storageBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(529),
+    /* overloads */ OverloadIndex(531),
   },
   {
     /* [81] */
@@ -11628,7 +11650,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(530),
+    /* overloads */ OverloadIndex(532),
   },
   {
     /* [84] */
@@ -11641,61 +11663,61 @@
     /* [85] */
     /* fn unpack2x16float(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(531),
+    /* overloads */ OverloadIndex(533),
   },
   {
     /* [86] */
     /* fn unpack2x16snorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(532),
+    /* overloads */ OverloadIndex(534),
   },
   {
     /* [87] */
     /* fn unpack2x16unorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(533),
+    /* overloads */ OverloadIndex(535),
   },
   {
     /* [88] */
     /* fn unpack4x8snorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(534),
+    /* overloads */ OverloadIndex(536),
   },
   {
     /* [89] */
     /* fn unpack4x8unorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(535),
+    /* overloads */ OverloadIndex(537),
   },
   {
     /* [90] */
     /* fn unpack4xI8(u32) -> vec4<i32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(536),
+    /* overloads */ OverloadIndex(538),
   },
   {
     /* [91] */
     /* fn unpack4xU8(u32) -> vec4<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(537),
+    /* overloads */ OverloadIndex(539),
   },
   {
     /* [92] */
     /* fn workgroupBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(529),
+    /* overloads */ OverloadIndex(531),
   },
   {
     /* [93] */
     /* fn workgroupUniformLoad[T](ptr<workgroup, T, read_write>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(538),
+    /* overloads */ OverloadIndex(540),
   },
   {
     /* [94] */
     /* fn textureBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(529),
+    /* overloads */ OverloadIndex(531),
   },
   {
     /* [95] */
@@ -11947,79 +11969,79 @@
     /* [110] */
     /* fn inputAttachmentLoad[T : fiu32](input_attachment: input_attachment<T>) -> vec4<T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(539),
+    /* overloads */ OverloadIndex(541),
   },
   {
     /* [111] */
     /* fn atomicLoad[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(540),
+    /* overloads */ OverloadIndex(542),
   },
   {
     /* [112] */
     /* fn atomicStore[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(541),
+    /* overloads */ OverloadIndex(543),
   },
   {
     /* [113] */
     /* fn atomicAdd[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(542),
+    /* overloads */ OverloadIndex(544),
   },
   {
     /* [114] */
     /* fn atomicSub[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(542),
+    /* overloads */ OverloadIndex(544),
   },
   {
     /* [115] */
     /* fn atomicMax[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(542),
+    /* overloads */ OverloadIndex(544),
   },
   {
     /* [116] */
     /* fn atomicMin[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(542),
+    /* overloads */ OverloadIndex(544),
   },
   {
     /* [117] */
     /* fn atomicAnd[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(542),
+    /* overloads */ OverloadIndex(544),
   },
   {
     /* [118] */
     /* fn atomicOr[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(542),
+    /* overloads */ OverloadIndex(544),
   },
   {
     /* [119] */
     /* fn atomicXor[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(542),
+    /* overloads */ OverloadIndex(544),
   },
   {
     /* [120] */
     /* fn atomicExchange[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(542),
+    /* overloads */ OverloadIndex(544),
   },
   {
     /* [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(543),
+    /* overloads */ OverloadIndex(545),
   },
   {
     /* [122] */
     /* fn subgroupBallot(bool) -> vec4<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(544),
+    /* overloads */ OverloadIndex(546),
   },
   {
     /* [123] */
@@ -12058,9 +12080,30 @@
   },
   {
     /* [128] */
+    /* fn subgroupAnd[T : iu32](value: T) -> T */
+    /* fn subgroupAnd[N : num, T : iu32](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(485),
+  },
+  {
+    /* [129] */
+    /* fn subgroupOr[T : iu32](value: T) -> T */
+    /* fn subgroupOr[N : num, T : iu32](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(485),
+  },
+  {
+    /* [130] */
+    /* fn subgroupXor[T : iu32](value: T) -> T */
+    /* fn subgroupXor[N : num, T : iu32](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(485),
+  },
+  {
+    /* [131] */
     /* fn __tint_materialize[T](T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(545),
+    /* overloads */ OverloadIndex(547),
   },
 };
 
@@ -12069,34 +12112,34 @@
     /* [0] */
     /* op &[S : address_space, T, A : access](ref<S, T, A>) -> ptr<S, T, A> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(546),
+    /* overloads */ OverloadIndex(548),
   },
   {
     /* [1] */
     /* op *[S : address_space, T, A : access](ptr<S, T, A>) -> ref<S, T, A> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(547),
+    /* overloads */ OverloadIndex(549),
   },
   {
     /* [2] */
     /* op !(bool) -> bool */
     /* op ![N : num](vec<N, bool>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(485),
+    /* overloads */ OverloadIndex(487),
   },
   {
     /* [3] */
     /* op ~[T : ia_iu32](T) -> T */
     /* op ~[T : ia_iu32, N : num](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(487),
+    /* overloads */ OverloadIndex(489),
   },
   {
     /* [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(489),
+    /* overloads */ OverloadIndex(491),
   },
 };
 constexpr uint8_t kUnaryOperatorAnd = 0;
@@ -12163,7 +12206,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(491),
+    /* overloads */ OverloadIndex(493),
   },
   {
     /* [6] */
@@ -12187,69 +12230,69 @@
     /* [8] */
     /* op &&(bool, bool) -> bool */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(548),
+    /* overloads */ OverloadIndex(550),
   },
   {
     /* [9] */
     /* op ||(bool, bool) -> bool */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(549),
+    /* overloads */ OverloadIndex(551),
   },
   {
     /* [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(493),
+    /* overloads */ OverloadIndex(495),
   },
   {
     /* [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(495),
+    /* overloads */ OverloadIndex(497),
   },
   {
     /* [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(497),
+    /* overloads */ OverloadIndex(499),
   },
   {
     /* [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(499),
+    /* overloads */ OverloadIndex(501),
   },
   {
     /* [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(501),
+    /* overloads */ OverloadIndex(503),
   },
   {
     /* [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(503),
+    /* overloads */ OverloadIndex(505),
   },
   {
     /* [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(505),
+    /* overloads */ OverloadIndex(507),
   },
   {
     /* [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(507),
+    /* overloads */ OverloadIndex(509),
   },
 };
 constexpr uint8_t kBinaryOperatorPlus = 0;
@@ -12513,7 +12556,7 @@
     /* conv packedVec3<T : concrete_scalar>(vec3<T>) -> packedVec3<T> */
     /* conv packedVec3[T : concrete_scalar](vec3<T>) -> packedVec3<T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(509),
+    /* overloads */ OverloadIndex(511),
   },
 };
 
diff --git a/src/tint/lang/wgsl/reader/lower/lower.cc b/src/tint/lang/wgsl/reader/lower/lower.cc
index 223be6a..505c5df 100644
--- a/src/tint/lang/wgsl/reader/lower/lower.cc
+++ b/src/tint/lang/wgsl/reader/lower/lower.cc
@@ -172,6 +172,9 @@
         CASE(kSubgroupExclusiveAdd)
         CASE(kSubgroupMul)
         CASE(kSubgroupExclusiveMul)
+        CASE(kSubgroupAnd)
+        CASE(kSubgroupOr)
+        CASE(kSubgroupXor)
 
         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 d1a9f6f..7572c2b 100644
--- a/src/tint/lang/wgsl/wgsl.def
+++ b/src/tint/lang/wgsl/wgsl.def
@@ -630,6 +630,12 @@
 @must_use @stage("fragment", "compute") fn subgroupMul[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
 @must_use @stage("fragment", "compute") fn subgroupExclusiveMul[T: fiu32_f16](value: T) -> T
 @must_use @stage("fragment", "compute") fn subgroupExclusiveMul[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("fragment", "compute") fn subgroupAnd[T: iu32](value: T) -> T
+@must_use @stage("fragment", "compute") fn subgroupAnd[N: num, T: iu32](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("fragment", "compute") fn subgroupOr[T: iu32](value: T) -> T
+@must_use @stage("fragment", "compute") fn subgroupOr[N: num, T: iu32](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("fragment", "compute") fn subgroupXor[T: iu32](value: T) -> T
+@must_use @stage("fragment", "compute") fn subgroupXor[N: num, T: iu32](value: vec<N, T>) -> vec<N, T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Value constructors                                                         //
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
index 5877df8..b4876b18 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
@@ -650,6 +650,9 @@
                     case wgsl::BuiltinFn::kSubgroupExclusiveAdd:
                     case wgsl::BuiltinFn::kSubgroupMul:
                     case wgsl::BuiltinFn::kSubgroupExclusiveMul:
+                    case wgsl::BuiltinFn::kSubgroupAnd:
+                    case wgsl::BuiltinFn::kSubgroupOr:
+                    case wgsl::BuiltinFn::kSubgroupXor:
                         Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
                         break;
                     default:
diff --git a/src/tint/lang/wgsl/writer/raise/raise.cc b/src/tint/lang/wgsl/writer/raise/raise.cc
index f58ddd8..8422844 100644
--- a/src/tint/lang/wgsl/writer/raise/raise.cc
+++ b/src/tint/lang/wgsl/writer/raise/raise.cc
@@ -176,6 +176,9 @@
         CASE(kSubgroupMul)
         CASE(kSubgroupExclusiveMul)
         CASE(kInputAttachmentLoad)
+        CASE(kSubgroupAnd)
+        CASE(kSubgroupOr)
+        CASE(kSubgroupXor)
         case core::BuiltinFn::kNone:
             break;
     }
diff --git a/src/tint/utils/protos/ir/ir.proto b/src/tint/utils/protos/ir/ir.proto
index 5c81367..f2a569e 100644
--- a/src/tint/utils/protos/ir/ir.proto
+++ b/src/tint/utils/protos/ir/ir.proto
@@ -636,4 +636,7 @@
     subgroup_exclusive_add = 123;
     subgroup_mul = 124;
     subgroup_exclusive_mul = 125;
+    subgroup_and = 126;
+    subgroup_or = 127;
+    subgroup_xor = 128;
 }
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
index e4a3759..44d060e 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupAdd_0dd12a());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001661A078960(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.dxc.hlsl
index f49191a..5de76d8 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupAdd_0dd12a());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupAdd_0dd12a());
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.msl
index ac492e0..09e3c03 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_0dd12a();
+}
+
 kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_0dd12a();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl
index 9ef6160..2beeb4e 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupAdd_1280c8()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001BDE3BAF2E0(4,15-36): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.dxc.hlsl
index e0fe802..1a8bdc9 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupAdd_1280c8());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, subgroupAdd_1280c8());
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.msl
index 47c684f..7dde23d 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_1280c8();
+}
+
 kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_1280c8();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl
index 6a2dd87..eb88bf4 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupAdd_1eb429()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000018C2972F3E0(4,14-34): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.dxc.hlsl
index 52b4657..ba9d4ab 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAdd_1eb429()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupAdd_1eb429()));
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.msl
index 734bad7..e4231cb 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_1eb429();
+}
+
 kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_1eb429();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.fxc.hlsl
index 4f56ea1..2ad96d5 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<float16_t>(0u, subgroupAdd_225207());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000222ADE019D0(3,1-9): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.dxc.hlsl
index 4d9d979..ba68332 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupAdd_225207());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<float16_t>(0u, subgroupAdd_225207());
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.msl
index 9bbad35..a5692f7 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_225207();
+}
+
 kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_225207();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.fxc.hlsl
index d2372be..f60f456 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupAdd_22d041()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002FC41D5EFF0(4,14-35): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.dxc.hlsl
index b812050..173ad5d 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAdd_22d041()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupAdd_22d041()));
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.msl
index 94b82a1..67c83b4 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_22d041();
+}
+
 kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_22d041();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl
index 507c20b..13b7562 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupAdd_28db2c()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002314343F3E0(4,14-36): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.dxc.hlsl
index 818f1d7..6c177aa 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAdd_28db2c()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupAdd_28db2c()));
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.msl
index e645afe..62a5d4c 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_28db2c();
+}
+
 kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_28db2c();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl
index 8a6a62a..ff7cc33 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupAdd_2ab40a());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000266E3967020(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.dxc.hlsl
index 1184033..447fdf1 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupAdd_2ab40a());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupAdd_2ab40a());
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.msl
index cd777ee..f6c4c9c 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_2ab40a();
+}
+
 kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_2ab40a();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl
index 1202deb..0235de3 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupAdd_3854ae()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001B8C9424340(4,15-33): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.dxc.hlsl
index 2b63ee7..89134db 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupAdd_3854ae()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupAdd_3854ae()));
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.msl
index 09752ea..5ff1445 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_3854ae();
+}
+
 kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_3854ae();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl
index a613d28..a4cf741 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupAdd_6587ff()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000029ADEE61DA0(4,15-37): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.dxc.hlsl
index db59d93..8d1f025 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupAdd_6587ff());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, subgroupAdd_6587ff());
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.msl
index 5cb63ff..bb94b70 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_6587ff();
+}
+
 kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_6587ff();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl
index 1c8c0d5..48e4494 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupAdd_7d1215()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001CCCB8544D0(4,16-40): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.dxc.hlsl
index 8e59c52..66ebf60 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAdd_7d1215()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupAdd_7d1215()));
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.msl
index 16b35fc..d66a613 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_7d1215();
+}
+
 kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_7d1215();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl
index 6efad6c..01d102f 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupAdd_8f4c15()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000019F67A3F2E0(4,16-41): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.dxc.hlsl
index 7146a0d..a1c53fa 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAdd_8f4c15()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupAdd_8f4c15()));
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.msl
index 11faa14..6da7177 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_8f4c15();
+}
+
 kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_8f4c15();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl
index dcbc4fb..201e52e 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupAdd_b61df7()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000022108E12040(4,14-30): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.dxc.hlsl
index 9f79631..d261b5e 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupAdd_b61df7());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, subgroupAdd_b61df7());
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.msl
index db917f8..120fb5b 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_b61df7();
+}
+
 kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_b61df7();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl
index ef17b46..310aad5 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupAdd_ba53f9()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001D4149A22A0(4,13-28): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.dxc.hlsl
index 8cf6a14..2b9bcf2 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupAdd_ba53f9()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupAdd_ba53f9()));
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.msl
index e19e783..e98875d 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_ba53f9();
+}
+
 kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_ba53f9();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl
index 40ca027..88a2ad0 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupAdd_cae1ed());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000022F6A42F430(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.dxc.hlsl
index 9241d27..8273f26 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupAdd_cae1ed());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupAdd_cae1ed());
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.msl
index 4899492..44fee8b 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_cae1ed();
+}
+
 kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_cae1ed();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl
index a346652..21d8e29 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupAdd_dcf73f()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000020DED641DA0(4,16-39): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.dxc.hlsl
index dceb6a2..5291bcb 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAdd_dcf73f()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupAdd_dcf73f()));
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.msl
index 2019047..239188a 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_dcf73f();
+}
+
 kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_dcf73f();
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl
index b462565..7b23a86 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupAdd_fbc357()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000166A6A2F2E0(4,15-38): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.dxc.hlsl
index 388a2b9..36d18e8 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupAdd_fbc357());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupAdd_fbc357());
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.msl
index dd5e4fe..07047e2 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_fbc357();
+}
+
 kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_fbc357();
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl
new file mode 100644
index 0000000..2dd4a1a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupAnd(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupAnd_1877b3() -> vec3<i32>{
+  var res: vec3<i32> = subgroupAnd(vec3<i32>(1i));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..525cc10
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupAnd_1877b3() {
+  int3 tint_tmp = (1).xxx;
+  int3 res = asint(WaveActiveBitAnd(asuint(tint_tmp)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_1877b3()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_1877b3()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2b24bcf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupAnd_1877b3() {
+  int3 tint_tmp = (1).xxx;
+  int3 res = asint(WaveActiveBitAnd(asuint(tint_tmp)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_1877b3()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001E52F512120(5,20-53): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.glsl
new file mode 100644
index 0000000..1dafecf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupAnd_1877b3() -> vec3<i32> {
+  var res : vec3<i32> = subgroupAnd(vec3<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..8e21cde
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int3 subgroupAnd_1877b3() {
+  int3 arg = (1).xxx;
+  int3 res = asint(WaveActiveBitAnd(asuint(arg)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_1877b3()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_1877b3()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..81acd5f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupAnd_1877b3() {
+  int3 res = simd_and(int3(1));
+  return res;
+}
+
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_1877b3();
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_1877b3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..660df7e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.ir.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_1877b3 "subgroupAnd_1877b3"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_1877b3 = OpFunction %v3int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3int Function
+          %9 = OpGroupNonUniformBitwiseAnd %v3int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v3int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3int %subgroupAnd_1877b3
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %v3int %subgroupAnd_1877b3
+         %28 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.msl
new file mode 100644
index 0000000..17666fe
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int3 subgroupAnd_1877b3() {
+  int3 res = simd_and(int3(1));
+  return res;
+}
+
+fragment void fragment_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupAnd_1877b3());
+  return;
+}
+
+kernel void compute_main(device packed_int3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_int3(subgroupAnd_1877b3());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.spvasm
new file mode 100644
index 0000000..0c52c2e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupAnd_1877b3() -> vec3<i32> {
+  var res : vec3<i32> = subgroupAnd(vec3<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.wgsl
new file mode 100644
index 0000000..41e96b4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/1877b3.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupAnd_1877b3() -> vec3<i32> {
+  var res : vec3<i32> = subgroupAnd(vec3<i32>(1i));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl
new file mode 100644
index 0000000..8e3feaa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/376802.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupAnd(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupAnd_376802() -> vec2<u32>{
+  var res: vec2<u32> = subgroupAnd(vec2<u32>(1u));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_376802();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_376802();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f50605d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupAnd_376802() {
+  uint2 res = WaveActiveBitAnd((1u).xx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_376802()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_376802()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..ef07ceb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupAnd_376802() {
+  uint2 res = WaveActiveBitAnd((1u).xx);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_376802()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001F31EC14340(4,15-39): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.glsl
new file mode 100644
index 0000000..17f5159
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupAnd_376802() -> vec2<u32> {
+  var res : vec2<u32> = subgroupAnd(vec2<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_376802();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..c1e9f42
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint2 subgroupAnd_376802() {
+  uint2 res = WaveActiveBitAnd((1u).xx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupAnd_376802());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, subgroupAnd_376802());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e3d4587
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupAnd_376802() {
+  uint2 res = simd_and(uint2(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_376802();
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_376802();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..8a0512d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.ir.spvasm
@@ -0,0 +1,58 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_376802 "subgroupAnd_376802"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_376802 = OpFunction %v2uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function
+          %9 = OpGroupNonUniformBitwiseAnd %v2uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v2uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v2uint %subgroupAnd_376802
+         %21 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %v2uint %subgroupAnd_376802
+         %27 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.msl
new file mode 100644
index 0000000..1269ea0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint2 subgroupAnd_376802() {
+  uint2 res = simd_and(uint2(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_376802();
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_376802();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.spvasm
new file mode 100644
index 0000000..3421df5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupAnd_376802() -> vec2<u32> {
+  var res : vec2<u32> = subgroupAnd(vec2<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_376802();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.wgsl
new file mode 100644
index 0000000..8c6b7b0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/376802.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupAnd_376802() -> vec2<u32> {
+  var res : vec2<u32> = subgroupAnd(vec2<u32>(1u));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_376802();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_376802();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl
new file mode 100644
index 0000000..87ff8a4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupAnd(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupAnd_4adc72() -> vec2<i32>{
+  var res: vec2<i32> = subgroupAnd(vec2<i32>(1i));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3d8ca00
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupAnd_4adc72() {
+  int2 tint_tmp = (1).xx;
+  int2 res = asint(WaveActiveBitAnd(asuint(tint_tmp)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_4adc72()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_4adc72()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..f1aa4a9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupAnd_4adc72() {
+  int2 tint_tmp = (1).xx;
+  int2 res = asint(WaveActiveBitAnd(asuint(tint_tmp)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_4adc72()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000017C0FBA7D40(5,20-53): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.glsl
new file mode 100644
index 0000000..28a6946
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupAnd_4adc72() -> vec2<i32> {
+  var res : vec2<i32> = subgroupAnd(vec2<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..190f55e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int2 subgroupAnd_4adc72() {
+  int2 arg = (1).xx;
+  int2 res = asint(WaveActiveBitAnd(asuint(arg)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_4adc72()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_4adc72()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9e76ead
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupAnd_4adc72() {
+  int2 res = simd_and(int2(1));
+  return res;
+}
+
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_4adc72();
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_4adc72();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..c75b481
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.ir.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_4adc72 "subgroupAnd_4adc72"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_4adc72 = OpFunction %v2int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2int Function
+          %9 = OpGroupNonUniformBitwiseAnd %v2int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v2int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2int %subgroupAnd_4adc72
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %v2int %subgroupAnd_4adc72
+         %28 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.msl
new file mode 100644
index 0000000..0035f66
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int2 subgroupAnd_4adc72() {
+  int2 res = simd_and(int2(1));
+  return res;
+}
+
+fragment void fragment_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_4adc72();
+  return;
+}
+
+kernel void compute_main(device int2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_4adc72();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.spvasm
new file mode 100644
index 0000000..17b4bd4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupAnd_4adc72() -> vec2<i32> {
+  var res : vec2<i32> = subgroupAnd(vec2<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.wgsl
new file mode 100644
index 0000000..29e6e57
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4adc72.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupAnd_4adc72() -> vec2<i32> {
+  var res : vec2<i32> = subgroupAnd(vec2<i32>(1i));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl
new file mode 100644
index 0000000..34bc3fa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4df632.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupAnd(value: u32) -> u32
+fn subgroupAnd_4df632() -> u32{
+  var res: u32 = subgroupAnd(1u);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..bde3e40
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupAnd_4df632() {
+  uint res = WaveActiveBitAnd(1u);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_4df632()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_4df632()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..a5ab851
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupAnd_4df632() {
+  uint res = WaveActiveBitAnd(1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_4df632()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001C62A3C1D70(4,14-33): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.glsl
new file mode 100644
index 0000000..b81ba20
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAnd_4df632() -> u32 {
+  var res : u32 = subgroupAnd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..be8ce78
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint subgroupAnd_4df632() {
+  uint res = WaveActiveBitAnd(1u);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupAnd_4df632());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, subgroupAnd_4df632());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.ir.msl
new file mode 100644
index 0000000..f136833
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupAnd_4df632() {
+  uint res = simd_and(1u);
+  return res;
+}
+
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_4df632();
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_4df632();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9aa655d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_4df632 "subgroupAnd_4df632"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_4df632 = OpFunction %uint None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function
+          %8 = OpGroupNonUniformBitwiseAnd %uint %uint_3 Reduce %uint_1
+               OpStore %res %8
+         %13 = OpLoad %uint %res
+               OpReturnValue %13
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %16
+         %17 = OpLabel
+         %18 = OpFunctionCall %uint %subgroupAnd_4df632
+         %19 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %19 %18
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %16
+         %23 = OpLabel
+         %24 = OpFunctionCall %uint %subgroupAnd_4df632
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %25 %24
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.msl
new file mode 100644
index 0000000..0a27b695
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint subgroupAnd_4df632() {
+  uint res = simd_and(1u);
+  return res;
+}
+
+fragment void fragment_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_4df632();
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_4df632();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.spvasm
new file mode 100644
index 0000000..62215a0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAnd_4df632() -> u32 {
+  var res : u32 = subgroupAnd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.wgsl
new file mode 100644
index 0000000..50e63a0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/4df632.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAnd_4df632() -> u32 {
+  var res : u32 = subgroupAnd(1u);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl
new file mode 100644
index 0000000..708e94a7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/97655b.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupAnd(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupAnd_97655b() -> vec4<i32>{
+  var res: vec4<i32> = subgroupAnd(vec4<i32>(1i));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..721966e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupAnd_97655b() {
+  int4 tint_tmp = (1).xxxx;
+  int4 res = asint(WaveActiveBitAnd(asuint(tint_tmp)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_97655b()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_97655b()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d9f6ebe
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupAnd_97655b() {
+  int4 tint_tmp = (1).xxxx;
+  int4 res = asint(WaveActiveBitAnd(asuint(tint_tmp)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_97655b()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001613FAC8480(5,20-53): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.glsl
new file mode 100644
index 0000000..e95b860
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupAnd_97655b() -> vec4<i32> {
+  var res : vec4<i32> = subgroupAnd(vec4<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..7bcbb34
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int4 subgroupAnd_97655b() {
+  int4 arg = (1).xxxx;
+  int4 res = asint(WaveActiveBitAnd(asuint(arg)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_97655b()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_97655b()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.ir.msl
new file mode 100644
index 0000000..3cb299d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupAnd_97655b() {
+  int4 res = simd_and(int4(1));
+  return res;
+}
+
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_97655b();
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_97655b();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..7222131
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.ir.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_97655b "subgroupAnd_97655b"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_97655b = OpFunction %v4int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4int Function
+          %9 = OpGroupNonUniformBitwiseAnd %v4int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v4int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4int %subgroupAnd_97655b
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %v4int %subgroupAnd_97655b
+         %28 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.msl
new file mode 100644
index 0000000..2574f5d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int4 subgroupAnd_97655b() {
+  int4 res = simd_and(int4(1));
+  return res;
+}
+
+fragment void fragment_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_97655b();
+  return;
+}
+
+kernel void compute_main(device int4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_97655b();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.spvasm
new file mode 100644
index 0000000..a77b37d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupAnd_97655b() -> vec4<i32> {
+  var res : vec4<i32> = subgroupAnd(vec4<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.wgsl
new file mode 100644
index 0000000..fd08591
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/97655b.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupAnd_97655b() -> vec4<i32> {
+  var res : vec4<i32> = subgroupAnd(vec4<i32>(1i));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl
new file mode 100644
index 0000000..ea9bd88
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupAnd(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupAnd_ad0cd3() -> vec3<u32>{
+  var res: vec3<u32> = subgroupAnd(vec3<u32>(1u));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..927ae89
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupAnd_ad0cd3() {
+  uint3 res = WaveActiveBitAnd((1u).xxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_ad0cd3()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_ad0cd3()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6a7ecca
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupAnd_ad0cd3() {
+  uint3 res = WaveActiveBitAnd((1u).xxx);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_ad0cd3()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001C8B473F2E0(4,15-40): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.glsl
new file mode 100644
index 0000000..a6c7c97
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupAnd_ad0cd3() -> vec3<u32> {
+  var res : vec3<u32> = subgroupAnd(vec3<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..81d96ed
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint3 subgroupAnd_ad0cd3() {
+  uint3 res = WaveActiveBitAnd((1u).xxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupAnd_ad0cd3());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, subgroupAnd_ad0cd3());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..5b84dcc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupAnd_ad0cd3() {
+  uint3 res = simd_and(uint3(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_ad0cd3();
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_ad0cd3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2957660
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.ir.spvasm
@@ -0,0 +1,58 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_ad0cd3 "subgroupAnd_ad0cd3"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_ad0cd3 = OpFunction %v3uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function
+          %9 = OpGroupNonUniformBitwiseAnd %v3uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v3uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v3uint %subgroupAnd_ad0cd3
+         %21 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %v3uint %subgroupAnd_ad0cd3
+         %27 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.msl
new file mode 100644
index 0000000..b4db20f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint3 subgroupAnd_ad0cd3() {
+  uint3 res = simd_and(uint3(1u));
+  return res;
+}
+
+fragment void fragment_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupAnd_ad0cd3());
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_uint3(subgroupAnd_ad0cd3());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.spvasm
new file mode 100644
index 0000000..60f582a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupAnd_ad0cd3() -> vec3<u32> {
+  var res : vec3<u32> = subgroupAnd(vec3<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.wgsl
new file mode 100644
index 0000000..8e78479
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/ad0cd3.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupAnd_ad0cd3() -> vec3<u32> {
+  var res : vec3<u32> = subgroupAnd(vec3<u32>(1u));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl
new file mode 100644
index 0000000..80adb0b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupAnd(value: i32) -> i32
+fn subgroupAnd_c6fc92() -> i32{
+  var res: i32 = subgroupAnd(1i);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..30aaa02
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupAnd_c6fc92() {
+  int res = asint(WaveActiveBitAnd(asuint(1)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_c6fc92()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_c6fc92()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2c07048
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupAnd_c6fc92() {
+  int res = asint(WaveActiveBitAnd(asuint(1)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_c6fc92()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001D230F277C0(4,19-45): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.glsl
new file mode 100644
index 0000000..e3b7b4e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAnd_c6fc92() -> i32 {
+  var res : i32 = subgroupAnd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..2d15c53
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int subgroupAnd_c6fc92() {
+  int res = asint(WaveActiveBitAnd(asuint(1)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_c6fc92()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_c6fc92()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.ir.msl
new file mode 100644
index 0000000..845c78e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupAnd_c6fc92() {
+  int res = simd_and(1);
+  return res;
+}
+
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_c6fc92();
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_c6fc92();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..7808aad
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.ir.spvasm
@@ -0,0 +1,57 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_c6fc92 "subgroupAnd_c6fc92"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_c6fc92 = OpFunction %int None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_int Function
+          %8 = OpGroupNonUniformBitwiseAnd %int %uint_3 Reduce %int_1
+               OpStore %res %8
+         %14 = OpLoad %int %res
+               OpReturnValue %14
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %int %subgroupAnd_c6fc92
+         %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %24 = OpLabel
+         %25 = OpFunctionCall %int %subgroupAnd_c6fc92
+         %26 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %26 %25
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.msl
new file mode 100644
index 0000000..a05d45e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int subgroupAnd_c6fc92() {
+  int res = simd_and(1);
+  return res;
+}
+
+fragment void fragment_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_c6fc92();
+  return;
+}
+
+kernel void compute_main(device int* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_c6fc92();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.spvasm
new file mode 100644
index 0000000..fbfe31a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAnd_c6fc92() -> i32 {
+  var res : i32 = subgroupAnd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.wgsl
new file mode 100644
index 0000000..9018965
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/c6fc92.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAnd_c6fc92() -> i32 {
+  var res : i32 = subgroupAnd(1i);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl
new file mode 100644
index 0000000..5cb2369
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupAnd(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupAnd_d2c9a6() -> vec4<u32>{
+  var res: vec4<u32> = subgroupAnd(vec4<u32>(1u));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..15958b6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupAnd_d2c9a6() {
+  uint4 res = WaveActiveBitAnd((1u).xxxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_d2c9a6()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_d2c9a6()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..148c3e6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupAnd_d2c9a6() {
+  uint4 res = WaveActiveBitAnd((1u).xxxx);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_d2c9a6()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001576ECA5300(4,15-41): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.glsl
new file mode 100644
index 0000000..ad56764
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupAnd_d2c9a6() -> vec4<u32> {
+  var res : vec4<u32> = subgroupAnd(vec4<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..f35138f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint4 subgroupAnd_d2c9a6() {
+  uint4 res = WaveActiveBitAnd((1u).xxxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupAnd_d2c9a6());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, subgroupAnd_d2c9a6());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.ir.msl
new file mode 100644
index 0000000..34f7917
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupAnd_d2c9a6() {
+  uint4 res = simd_and(uint4(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_d2c9a6();
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_d2c9a6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..7890363
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.ir.spvasm
@@ -0,0 +1,58 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_d2c9a6 "subgroupAnd_d2c9a6"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_d2c9a6 = OpFunction %v4uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4uint Function
+          %9 = OpGroupNonUniformBitwiseAnd %v4uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v4uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v4uint %subgroupAnd_d2c9a6
+         %21 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %v4uint %subgroupAnd_d2c9a6
+         %27 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.msl
new file mode 100644
index 0000000..1af3d4f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint4 subgroupAnd_d2c9a6() {
+  uint4 res = simd_and(uint4(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_d2c9a6();
+  return;
+}
+
+kernel void compute_main(device uint4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_d2c9a6();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.spvasm
new file mode 100644
index 0000000..66daac9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupAnd_d2c9a6() -> vec4<u32> {
+  var res : vec4<u32> = subgroupAnd(vec4<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.wgsl
new file mode 100644
index 0000000..81d4192
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAnd/d2c9a6.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupAnd_d2c9a6() -> vec4<u32> {
+  var res : vec4<u32> = subgroupAnd(vec4<u32>(1u));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBallot/1a8251.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBallot/1a8251.wgsl.expected.fxc.hlsl
index 0b7c2e7..9037fc7 100644
--- a/test/tint/builtins/gen/literal/subgroupBallot/1a8251.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBallot/1a8251.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupBallot_1a8251()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002563DC4D4F0(4,15-36): error X3004: undeclared identifier 'WaveActiveBallot'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBallot/1a8251.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBallot/1a8251.wgsl.expected.ir.dxc.hlsl
index afcaa70..6339f6a 100644
--- a/test/tint/builtins/gen/literal/subgroupBallot/1a8251.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBallot/1a8251.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupBallot_1a8251());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupBallot_1a8251());
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.fxc.hlsl
index 157e3dd..82c4a6c 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.fxc.hlsl
@@ -1,14 +1,17 @@
 SKIP: FAILED
 
-RWByteAddressBuffer prevent_dce : register(u0, space2);
+RWByteAddressBuffer prevent_dce : register(u0);
 
-void subgroupBroadcast_07e2d8() {
+float16_t subgroupBroadcast_07e2d8() {
   float16_t res = WaveReadLaneAt(float16_t(1.0h), 1u);
-  prevent_dce.Store<float16_t>(0u, res);
+  return res;
 }
 
 [numthreads(1, 1, 1)]
 void compute_main() {
-  subgroupBroadcast_07e2d8();
+  prevent_dce.Store<float16_t>(0u, subgroupBroadcast_07e2d8());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000207D706F440(3,1-9): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.ir.dxc.hlsl
index 32aec75..4d70c8b 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupBroadcast_07e2d8());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<float16_t>(0u, subgroupBroadcast_07e2d8());
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.fxc.hlsl
index 9f667dd..af3b990 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float subgroupBroadcast_08beca() {
+  float res = WaveReadLaneAt(1.0f, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupBroadcast_08beca()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001F382910100(4,15-38): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.ir.dxc.hlsl
index 2ee8261..6c884c6 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupBroadcast_08beca()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupBroadcast_08beca()));
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.fxc.hlsl
index 9f667dd..ac6f641 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 4> subgroupBroadcast_0f44e2() {
+  vector<float16_t, 4> res = WaveReadLaneAt((float16_t(1.0h)).xxxx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcast_0f44e2());
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000019016CEC400(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.ir.dxc.hlsl
index 596a06b..b0beabd 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcast_0f44e2());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcast_0f44e2());
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.fxc.hlsl
index 9f667dd..4c8411f 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 2> subgroupBroadcast_13f36c() {
+  vector<float16_t, 2> res = WaveReadLaneAt((float16_t(1.0h)).xx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcast_13f36c());
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000027E59DAF440(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.ir.dxc.hlsl
index 0c5b327..7c528c8 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcast_13f36c());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcast_13f36c());
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.fxc.hlsl
index 9f667dd..092f41e 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupBroadcast_1d79c7() {
+  int res = WaveReadLaneAt(1, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupBroadcast_1d79c7()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000017D40F3C6A0(4,13-33): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.ir.dxc.hlsl
index f7ca939..a46a6c0 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupBroadcast_1d79c7()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupBroadcast_1d79c7()));
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.fxc.hlsl
index 9f667dd..5abc47c 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupBroadcast_279027() {
+  uint4 res = WaveReadLaneAt((1u).xxxx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupBroadcast_279027()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002212FF5C630(4,15-43): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.ir.dxc.hlsl
index ed7f18d..c136189 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupBroadcast_279027());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupBroadcast_279027());
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.fxc.hlsl
index 9f667dd..7c1babf 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupBroadcast_34fa3d() {
+  uint3 res = WaveReadLaneAt((1u).xxx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupBroadcast_34fa3d()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002247C411740(4,15-42): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.ir.dxc.hlsl
index 8269f0f..6fb8eaf 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupBroadcast_34fa3d());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, subgroupBroadcast_34fa3d());
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.fxc.hlsl
index 9f667dd..a89cad2 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupBroadcast_3e6879() {
+  int2 res = WaveReadLaneAt((1).xx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupBroadcast_3e6879()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000024C7A480D80(4,14-39): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.ir.dxc.hlsl
index 01a78e8..dd38aef 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupBroadcast_3e6879()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupBroadcast_3e6879()));
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.fxc.hlsl
index 9f667dd..089c5ad 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 3> subgroupBroadcast_41e5d7() {
+  vector<float16_t, 3> res = WaveReadLaneAt((float16_t(1.0h)).xxx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcast_41e5d7());
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000213C7AF8740(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.ir.dxc.hlsl
index 07d3bef..e2c578d 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcast_41e5d7());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcast_41e5d7());
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.fxc.hlsl
index 9f667dd..723b874 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupBroadcast_4a4334() {
+  uint2 res = WaveReadLaneAt((1u).xx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupBroadcast_4a4334()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000017F3FA1F380(4,15-41): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.ir.dxc.hlsl
index 265729a..75e478d 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupBroadcast_4a4334());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, subgroupBroadcast_4a4334());
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.fxc.hlsl
index 9f667dd..3e3304f 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float2 subgroupBroadcast_5196c8() {
+  float2 res = WaveReadLaneAt((1.0f).xx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupBroadcast_5196c8()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000224A7E223E0(4,16-44): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.ir.dxc.hlsl
index c8b9822..a237473 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupBroadcast_5196c8()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupBroadcast_5196c8()));
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.fxc.hlsl
index 9f667dd..d5cb6a2 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float3 subgroupBroadcast_912ff5() {
+  float3 res = WaveReadLaneAt((1.0f).xxx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupBroadcast_912ff5()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001F7AC5AEE90(4,16-45): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.ir.dxc.hlsl
index 64ceb3a..79677bd 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupBroadcast_912ff5()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupBroadcast_912ff5()));
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.fxc.hlsl
index 9f667dd..2904a3c 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float4 subgroupBroadcast_b7e93b() {
+  float4 res = WaveReadLaneAt((1.0f).xxxx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupBroadcast_b7e93b()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002A4C62002F0(4,16-46): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.ir.dxc.hlsl
index 8ded22c..f293c2f 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupBroadcast_b7e93b()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupBroadcast_b7e93b()));
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.fxc.hlsl
index 9f667dd..6d7e6c6 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupBroadcast_c36fe1() {
+  uint res = WaveReadLaneAt(1u, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupBroadcast_c36fe1()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000028F3D630CD0(4,14-35): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.ir.dxc.hlsl
index f68bf9d..ee48ffc 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupBroadcast_c36fe1());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, subgroupBroadcast_c36fe1());
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.fxc.hlsl
index 9f667dd..70976fa 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupBroadcast_e275c8() {
+  int3 res = WaveReadLaneAt((1).xxx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupBroadcast_e275c8()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002A9C6836020(4,14-40): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.ir.dxc.hlsl
index 2688f25..f0ac901 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupBroadcast_e275c8()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupBroadcast_e275c8()));
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.fxc.hlsl
index 9f667dd..53a7b311 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.fxc.hlsl
@@ -1,9 +1,17 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupBroadcast_f637f9() {
+  int4 res = WaveReadLaneAt((1).xxxx, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupBroadcast_f637f9()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001EC7B068090(4,14-41): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.ir.dxc.hlsl
index 528079b..3ac8c00 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupBroadcast_f637f9()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupBroadcast_f637f9()));
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
index 8ee3e90..b4450fc 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveAdd_01de08());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001C39A2580B0(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.dxc.hlsl
index f8e3f12..7341b83 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveAdd_01de08());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveAdd_01de08());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl
index f595c4a..c727100 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_01de08();
+}
+
 kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_01de08();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl
index 3aa01d6..175313c 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_0ff95a()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000217AC3EC550(4,15-37): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.dxc.hlsl
index dba3306..825de03 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupExclusiveAdd_0ff95a());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, subgroupExclusiveAdd_0ff95a());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl
index a2c95f9..42ae314 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_0ff95a();
+}
+
 kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_0ff95a();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl
index 7281ba0..50fcf02 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_406ab4()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002ABAC96F970(4,14-36): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.dxc.hlsl
index c4c2e98..28d6f69 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_406ab4()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_406ab4()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl
index e2adb10..b4559e8 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_406ab4();
+}
+
 kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_406ab4();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl
index 8ba31d5..9a7bb13 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_41cfde()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002044F4DC550(4,16-40): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.dxc.hlsl
index c5a42fd..57bb3ba 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_41cfde()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_41cfde()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl
index d400884..0ea6ee6 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_41cfde();
+}
+
 kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_41cfde();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl
index 955a0d7..e6074a5 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_42684c()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001F78FBAF3F0(4,14-30): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.dxc.hlsl
index 5de8777..832d7ef 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupExclusiveAdd_42684c());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, subgroupExclusiveAdd_42684c());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl
index d192852..d0d96cc 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_42684c();
+}
+
 kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_42684c();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl
index a6ff3d9..ede5c21 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_48acea()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002434C54CE20(4,15-36): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.dxc.hlsl
index 926a30d..a50e53c 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupExclusiveAdd_48acea());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, subgroupExclusiveAdd_48acea());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl
index 349ff97..ebbb1dc 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_48acea();
+}
+
 kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_48acea();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl
index 45a569a..dc2c87b 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<float16_t>(0u, subgroupExclusiveAdd_4a1568());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000015CCCF51AB0(3,1-9): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.dxc.hlsl
index d589d20..7520bf6 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupExclusiveAdd_4a1568());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<float16_t>(0u, subgroupExclusiveAdd_4a1568());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl
index ea83663..7dd1edc 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4a1568();
+}
+
 kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4a1568();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl
index ee30a7c..f9087e0 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_4c8024()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001FCA2BDF3F0(4,16-39): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.dxc.hlsl
index c7188f9..b58dae7 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_4c8024()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_4c8024()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl
index c9e215c..8ad8c28 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4c8024();
+}
+
 kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4c8024();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl
index c837f15..3111933 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_71ad0f()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000160F97AC550(4,16-41): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.dxc.hlsl
index 731888d..0230df0 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_71ad0f()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_71ad0f()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl
index b4bd39d..c2949fd 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_71ad0f();
+}
+
 kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_71ad0f();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl
index 6664dea..cf95992 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveAdd_95e984());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000019C4A627D30(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.dxc.hlsl
index 142b7c3..e01283a 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveAdd_95e984());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveAdd_95e984());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl
index 75ba999..5a587db 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_95e984();
+}
+
 kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_95e984();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl
index 97048be..65b03ee 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_967e38()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000192073E8300(4,15-33): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.dxc.hlsl
index f65fa36..e3bc466 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_967e38()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_967e38()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl
index 9d358dd..efa4e7f 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_967e38();
+}
+
 kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_967e38();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl
index 8fba167..d32bfa5 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_b0c261()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000027EADF51C30(4,13-28): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.dxc.hlsl
index 8664606..a49ac3c 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_b0c261()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_b0c261()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl
index 8d49f49..48b9211 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_b0c261();
+}
+
 kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_b0c261();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl
index 2750d7a..353aaf1 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_c08160()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000278EC974970(4,14-35): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.dxc.hlsl
index c6fb770..18cd9ed 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_c08160()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_c08160()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl
index b6d018f..33b41db 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_c08160();
+}
+
 kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_c08160();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl
index ab9ac06..bb71690 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveAdd_e58e23());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002903A364710(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.dxc.hlsl
index 39e048f..84df7f3 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveAdd_e58e23());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveAdd_e58e23());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl
index bdf1bd4..eef17ee 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_e58e23();
+}
+
 kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_e58e23();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl
index b7a6e60..111ba58 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_ec300f()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000018FC519F3F0(4,15-38): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.dxc.hlsl
index 38bbd727..ac8c7cb 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupExclusiveAdd_ec300f());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupExclusiveAdd_ec300f());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl
index 9bfac87..934cc29 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_ec300f();
+}
+
 kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_ec300f();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl
index e4e83a5..d5b6f16 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_f0f712()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000025AAAA51BF0(4,14-34): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.dxc.hlsl
index 4092d77..1a3d12b 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_f0f712()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_f0f712()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl
index d7a6be8..bc76b90 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_f0f712();
+}
+
 kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_f0f712();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl
index 8e83854..cdf4d29 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_000b92()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002078E8DF3F0(4,15-42): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.dxc.hlsl
index b109c09..c7966c5 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupExclusiveMul_000b92());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupExclusiveMul_000b92());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl
index 8a3de1c..aeb044b 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_000b92();
+}
+
 kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_000b92();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl
index f02f975..09d6dcc 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_019660()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000021F33F0C7D0(4,14-40): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.dxc.hlsl
index bdadf6a..b7df744 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_019660()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_019660()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.msl
index e0f69a9..b8e07fc 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_019660();
+}
+
 kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_019660();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl
index 4ad2a9a..0194b1f 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_0a04d5()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001566884C550(4,16-44): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.dxc.hlsl
index 0e7a797..5032146 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_0a04d5()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_0a04d5()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl
index a141b09..ff0006a 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_0a04d5();
+}
+
 kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_0a04d5();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl
index ca0464b..2f55529 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveMul_13ba26());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000224AE26CC50(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.dxc.hlsl
index 68366fb..b00d9f9 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveMul_13ba26());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveMul_13ba26());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl
index d9ac306..cb5f01a 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_13ba26();
+}
+
 kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_13ba26();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl
index dbbecb0..566e2c8 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_25d1b9()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001B2E00620C0(4,16-43): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.dxc.hlsl
index 34b0c35..ea2f0eb 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_25d1b9()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_25d1b9()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl
index e09651a..c204737 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_25d1b9();
+}
+
 kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_25d1b9();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl
index 6911d3a..ddbd0b4 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_4525a3()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000017113907EF0(4,14-38): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.dxc.hlsl
index 06a6b79..8d12d2b 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_4525a3()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_4525a3()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl
index 50c126f..4f69ecb 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_4525a3();
+}
+
 kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_4525a3();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl
index 3256bd5..de93f3b 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<float16_t>(0u, subgroupExclusiveMul_6f431e());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000021D20F50BB0(3,1-9): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.dxc.hlsl
index c02c9dd..f0765f7 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupExclusiveMul_6f431e());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<float16_t>(0u, subgroupExclusiveMul_6f431e());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl
index 10b6369..7827b3d 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_6f431e();
+}
+
 kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_6f431e();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl
index a1305d2..cf1075d 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_7b5f57()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001F6384E3DD0(4,16-45): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.dxc.hlsl
index 934e2e4..7b5f69d 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_7b5f57()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_7b5f57()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl
index e584e4d..ec87b90 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_7b5f57();
+}
+
 kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_7b5f57();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl
index d278545..ee837c7 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_87f23e()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000019B8B1D3DD0(4,14-39): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.dxc.hlsl
index 8b882bd..31b06af 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_87f23e()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_87f23e()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl
index 7dd3584..41a5042 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_87f23e();
+}
+
 kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_87f23e();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl
index b5d05d1..37d6d70 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveMul_98b2e4()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002017E9F5BB0(4,15-37): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.dxc.hlsl
index 9d6c0db..f8946de 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupExclusiveMul_98b2e4()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupExclusiveMul_98b2e4()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl
index dbcebe3..59e2848 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_98b2e4();
+}
+
 kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_98b2e4();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl
index c66f298..a2223db 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveMul_a07956());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002299ABC1D50(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.dxc.hlsl
index 827baa6..0d51e26 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveMul_a07956());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveMul_a07956());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl
index e9d947c..351dfc7 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a07956();
+}
+
 kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a07956();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl
index be17c1c..2467bb0 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveMul_a23002()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001CDCCD4F3F0(4,13-32): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.dxc.hlsl
index b7a28a7..0a3ee4e 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupExclusiveMul_a23002()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupExclusiveMul_a23002()));
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl
index ece7a0a..3ee4ee4 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a23002();
+}
+
 kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a23002();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl
index de32a46..b4ca9e8 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_d1d490()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000025E395C5FA0(4,15-40): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.dxc.hlsl
index 12600d1a..fce011b 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupExclusiveMul_d1d490());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, subgroupExclusiveMul_d1d490());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl
index 170b39f..ded7aab 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_d1d490();
+}
+
 kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_d1d490();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl
index 742dc55..3770796 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveMul_dc51f8()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000012EF89EF3F0(4,14-34): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.dxc.hlsl
index 9e5321c..e0be118 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupExclusiveMul_dc51f8());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, subgroupExclusiveMul_dc51f8());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl
index dbd8707..3b0d5f1 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_dc51f8();
+}
+
 kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_dc51f8();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl
index f11c60c..ec29b44 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveMul_e88d1c());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000022F6AC68B40(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.dxc.hlsl
index 55a2f70..17f3e9e 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveMul_e88d1c());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveMul_e88d1c());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl
index 6833a93..09b9718 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_e88d1c();
+}
+
 kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_e88d1c();
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl
index 62c1133..1aee984 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_f039f4()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001EB5103F970(4,15-41): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.dxc.hlsl
index c48baf3..53ef888 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupExclusiveMul_f039f4());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, subgroupExclusiveMul_f039f4());
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl
index 590f77b..d9fa8b8 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_f039f4();
+}
+
 kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_f039f4();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl
index d305c41..8620d0d 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupMul_0de9d3()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001BA1BC386C0(4,15-37): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.dxc.hlsl
index d00247f..f3935b9 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupMul_0de9d3()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupMul_0de9d3()));
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.msl
index e19decc..68870e6 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_0de9d3();
+}
+
 kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_0de9d3();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.fxc.hlsl
index 28dbf5b..b4441e6 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<float16_t>(0u, subgroupMul_2941a2());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000228B15FF430(3,1-9): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.dxc.hlsl
index 64a17d3..d378576 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupMul_2941a2());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<float16_t>(0u, subgroupMul_2941a2());
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.msl
index 74cf643..1f1a738 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_2941a2();
+}
+
 kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_2941a2();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.fxc.hlsl
index 18a1faf..ff9b10a 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupMul_3fe886()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001A526C92170(4,13-32): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.dxc.hlsl
index 7ebf7e2..ed1a0af 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupMul_3fe886()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupMul_3fe886()));
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.msl
index da663c4..54fd66d 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_3fe886();
+}
+
 kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_3fe886();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl
index 5635568..a324328 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store(0u, asuint(subgroupMul_4f8ee6()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000268847D86C0(4,14-34): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.dxc.hlsl
index a787395..49ae517 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupMul_4f8ee6());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, subgroupMul_4f8ee6());
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.msl
index 984264d..149c0e4 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_4f8ee6();
+}
+
 kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_4f8ee6();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.fxc.hlsl
index 8b90347..c5e1bea 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupMul_53aee2());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000025DDFFBF430(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.dxc.hlsl
index 25f6a7c..392327a 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupMul_53aee2());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupMul_53aee2());
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.msl
index 6fbfb14..de18ffa 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_53aee2();
+}
+
 kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_53aee2();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl
index f9c6c9d..6ba247e 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupMul_5a8c86()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001AAF2D7BAC0(4,14-39): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.dxc.hlsl
index bf88683..55c4a3b 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupMul_5a8c86()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupMul_5a8c86()));
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.msl
index 88a528c..ad7ffdb 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_5a8c86();
+}
+
 kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_5a8c86();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.fxc.hlsl
index 88c49b3..d926941 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupMul_66c813()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001E48CF7C360(4,16-45): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.dxc.hlsl
index a1d52d4..29c2104 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupMul_66c813()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupMul_66c813()));
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.msl
index df341d2..3044b55 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_66c813();
+}
+
 kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_66c813();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl
index 5610811..567d8f7 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupMul_6aaaf3());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002112182F430(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.dxc.hlsl
index 8c260ff..c72e54c 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupMul_6aaaf3());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupMul_6aaaf3());
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.msl
index f64b1c4..96d2c9c 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_6aaaf3();
+}
+
 kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_6aaaf3();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.fxc.hlsl
index 1613fac..f8a7db9ca 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupMul_93eccd()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001952347BF90(4,16-44): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.dxc.hlsl
index 7ab3126..4fdf7bf 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupMul_93eccd()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupMul_93eccd()));
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.msl
index c928ea7..904779f 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_93eccd();
+}
+
 kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_93eccd();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.fxc.hlsl
index 9992021..2d730c9 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupMul_d584a2()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000020E62ABFFC0(4,14-38): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.dxc.hlsl
index 25febd2..bd301c2 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupMul_d584a2()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupMul_d584a2()));
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.msl
index 2be49de..a142629 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_d584a2();
+}
+
 kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_d584a2();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.fxc.hlsl
index c7b03ab..c31db94 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupMul_dc672a()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000174E653F3E0(4,15-40): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.dxc.hlsl
index 40613fa..628b43a 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupMul_dc672a());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, subgroupMul_dc672a());
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.msl
index 0814398..b31ad53 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_dc672a();
+}
+
 kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_dc672a();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.fxc.hlsl
index 8f5d2c9..1b41db8 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupMul_dd1333()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001D87F7EC440(4,15-42): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.dxc.hlsl
index 04dca66..3f86c5d 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupMul_dd1333());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupMul_dd1333());
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.msl
index 70d9503..a2b99f1 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_dd1333();
+}
+
 kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_dd1333();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl
index 5d8f15b..6c4d7db 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupMul_f2ac5b());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000020F6A5BF430(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.dxc.hlsl
index 05f98bf..493da7e 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupMul_f2ac5b());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupMul_f2ac5b());
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.msl
index 334c605..8a33e26 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_f2ac5b();
+}
+
 kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_f2ac5b();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.fxc.hlsl
index 4587245..bd389ef 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store2(0u, asuint(subgroupMul_f78398()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000188FB59CE00(4,16-43): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.dxc.hlsl
index 569a6d4..a9ee1a4 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupMul_f78398()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupMul_f78398()));
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.msl
index bca0a0c..4105914 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_f78398();
+}
+
 kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_f78398();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.fxc.hlsl
index f411959..3b8f759 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store3(0u, asuint(subgroupMul_fa781b()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000022E0402D850(4,15-41): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.dxc.hlsl
index eff9364..6a5b269 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupMul_fa781b());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, subgroupMul_fa781b());
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.msl
index 91cf98d..f0bcd73 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_fa781b();
+}
+
 kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_fa781b();
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.fxc.hlsl
index 7cc27c1..674a761 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.fxc.hlsl
@@ -12,3 +12,6 @@
   prevent_dce.Store4(0u, asuint(subgroupMul_fab258()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002584C071870(4,14-40): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.dxc.hlsl
index 194b6e8..fa170d4 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.dxc.hlsl
@@ -5,6 +5,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupMul_fab258()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupMul_fab258()));
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.msl
index 97d7888..ae5f197 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.msl
@@ -10,6 +10,11 @@
   return res;
 }
 
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_fab258();
+}
+
 kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_fab258();
diff --git a/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl
new file mode 100644
index 0000000..2e0f411
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/03343f.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupOr(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupOr_03343f() -> vec3<i32>{
+  var res: vec3<i32> = subgroupOr(vec3<i32>(1i));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_03343f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_03343f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..edd7771
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupOr_03343f() {
+  int3 tint_tmp = (1).xxx;
+  int3 res = asint(WaveActiveBitOr(asuint(tint_tmp)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_03343f()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_03343f()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8ae1bc1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupOr_03343f() {
+  int3 tint_tmp = (1).xxx;
+  int3 res = asint(WaveActiveBitOr(asuint(tint_tmp)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_03343f()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000016D913D2270(5,20-52): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.glsl
new file mode 100644
index 0000000..22a02dd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupOr_03343f() -> vec3<i32> {
+  var res : vec3<i32> = subgroupOr(vec3<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_03343f();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..5e028bb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int3 subgroupOr_03343f() {
+  int3 arg = (1).xxx;
+  int3 res = asint(WaveActiveBitOr(asuint(arg)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_03343f()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_03343f()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..f1fbdc6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupOr_03343f() {
+  int3 res = simd_or(int3(1));
+  return res;
+}
+
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_03343f();
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_03343f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..cc9028f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.ir.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_03343f "subgroupOr_03343f"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_03343f = OpFunction %v3int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3int Function
+          %9 = OpGroupNonUniformBitwiseOr %v3int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v3int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3int %subgroupOr_03343f
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %v3int %subgroupOr_03343f
+         %28 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.msl
new file mode 100644
index 0000000..3c61bbb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int3 subgroupOr_03343f() {
+  int3 res = simd_or(int3(1));
+  return res;
+}
+
+fragment void fragment_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupOr_03343f());
+  return;
+}
+
+kernel void compute_main(device packed_int3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_int3(subgroupOr_03343f());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.spvasm
new file mode 100644
index 0000000..97b5179
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupOr_03343f() -> vec3<i32> {
+  var res : vec3<i32> = subgroupOr(vec3<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_03343f();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.wgsl
new file mode 100644
index 0000000..b1f472a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/03343f.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupOr_03343f() -> vec3<i32> {
+  var res : vec3<i32> = subgroupOr(vec3<i32>(1i));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_03343f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_03343f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl
new file mode 100644
index 0000000..50c7eda
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/0bc264.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupOr(value: u32) -> u32
+fn subgroupOr_0bc264() -> u32{
+  var res: u32 = subgroupOr(1u);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..14e1621
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupOr_0bc264() {
+  uint res = WaveActiveBitOr(1u);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_0bc264()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_0bc264()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..96c80f8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupOr_0bc264() {
+  uint res = WaveActiveBitOr(1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_0bc264()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000247F8842930(4,14-32): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.glsl
new file mode 100644
index 0000000..8004d7c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupOr_0bc264() -> u32 {
+  var res : u32 = subgroupOr(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..c78676f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint subgroupOr_0bc264() {
+  uint res = WaveActiveBitOr(1u);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupOr_0bc264());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, subgroupOr_0bc264());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.ir.msl
new file mode 100644
index 0000000..551d5a6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupOr_0bc264() {
+  uint res = simd_or(1u);
+  return res;
+}
+
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_0bc264();
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_0bc264();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..e89680c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_0bc264 "subgroupOr_0bc264"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_0bc264 = OpFunction %uint None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function
+          %8 = OpGroupNonUniformBitwiseOr %uint %uint_3 Reduce %uint_1
+               OpStore %res %8
+         %13 = OpLoad %uint %res
+               OpReturnValue %13
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %16
+         %17 = OpLabel
+         %18 = OpFunctionCall %uint %subgroupOr_0bc264
+         %19 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %19 %18
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %16
+         %23 = OpLabel
+         %24 = OpFunctionCall %uint %subgroupOr_0bc264
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %25 %24
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.msl
new file mode 100644
index 0000000..fb1affc02
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint subgroupOr_0bc264() {
+  uint res = simd_or(1u);
+  return res;
+}
+
+fragment void fragment_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_0bc264();
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_0bc264();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.spvasm
new file mode 100644
index 0000000..0427b59
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupOr_0bc264() -> u32 {
+  var res : u32 = subgroupOr(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.wgsl
new file mode 100644
index 0000000..322d8ab
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/0bc264.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupOr_0bc264() -> u32 {
+  var res : u32 = subgroupOr(1u);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl
new file mode 100644
index 0000000..a23cbf1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupOr(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupOr_3f60e0() -> vec2<i32>{
+  var res: vec2<i32> = subgroupOr(vec2<i32>(1i));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..417dd73
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupOr_3f60e0() {
+  int2 tint_tmp = (1).xx;
+  int2 res = asint(WaveActiveBitOr(asuint(tint_tmp)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_3f60e0()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_3f60e0()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..41af36f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupOr_3f60e0() {
+  int2 tint_tmp = (1).xx;
+  int2 res = asint(WaveActiveBitOr(asuint(tint_tmp)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_3f60e0()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000283D71F1990(5,20-52): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.glsl
new file mode 100644
index 0000000..3417a29
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupOr_3f60e0() -> vec2<i32> {
+  var res : vec2<i32> = subgroupOr(vec2<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..7de3e16
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int2 subgroupOr_3f60e0() {
+  int2 arg = (1).xx;
+  int2 res = asint(WaveActiveBitOr(asuint(arg)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_3f60e0()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_3f60e0()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.ir.msl
new file mode 100644
index 0000000..81d2b35
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupOr_3f60e0() {
+  int2 res = simd_or(int2(1));
+  return res;
+}
+
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_3f60e0();
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_3f60e0();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..e49ec53
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.ir.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_3f60e0 "subgroupOr_3f60e0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_3f60e0 = OpFunction %v2int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2int Function
+          %9 = OpGroupNonUniformBitwiseOr %v2int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v2int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2int %subgroupOr_3f60e0
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %v2int %subgroupOr_3f60e0
+         %28 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.msl
new file mode 100644
index 0000000..e3c533e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int2 subgroupOr_3f60e0() {
+  int2 res = simd_or(int2(1));
+  return res;
+}
+
+fragment void fragment_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_3f60e0();
+  return;
+}
+
+kernel void compute_main(device int2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_3f60e0();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.spvasm
new file mode 100644
index 0000000..5e2d8ea
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupOr_3f60e0() -> vec2<i32> {
+  var res : vec2<i32> = subgroupOr(vec2<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.wgsl
new file mode 100644
index 0000000..0368ecb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/3f60e0.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupOr_3f60e0() -> vec2<i32> {
+  var res : vec2<i32> = subgroupOr(vec2<i32>(1i));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl
new file mode 100644
index 0000000..2a19866
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupOr(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupOr_4d4eb0() -> vec4<i32>{
+  var res: vec4<i32> = subgroupOr(vec4<i32>(1i));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b7c8d5c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupOr_4d4eb0() {
+  int4 tint_tmp = (1).xxxx;
+  int4 res = asint(WaveActiveBitOr(asuint(tint_tmp)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_4d4eb0()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_4d4eb0()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6f33107
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupOr_4d4eb0() {
+  int4 tint_tmp = (1).xxxx;
+  int4 res = asint(WaveActiveBitOr(asuint(tint_tmp)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_4d4eb0()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001F1F762F3E0(5,20-52): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.glsl
new file mode 100644
index 0000000..16431dd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupOr_4d4eb0() -> vec4<i32> {
+  var res : vec4<i32> = subgroupOr(vec4<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..a694c38
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int4 subgroupOr_4d4eb0() {
+  int4 arg = (1).xxxx;
+  int4 res = asint(WaveActiveBitOr(asuint(arg)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_4d4eb0()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_4d4eb0()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.ir.msl
new file mode 100644
index 0000000..48b1f93
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupOr_4d4eb0() {
+  int4 res = simd_or(int4(1));
+  return res;
+}
+
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_4d4eb0();
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_4d4eb0();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..4fbf275
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.ir.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_4d4eb0 "subgroupOr_4d4eb0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_4d4eb0 = OpFunction %v4int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4int Function
+          %9 = OpGroupNonUniformBitwiseOr %v4int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v4int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4int %subgroupOr_4d4eb0
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %v4int %subgroupOr_4d4eb0
+         %28 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.msl
new file mode 100644
index 0000000..88786a8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int4 subgroupOr_4d4eb0() {
+  int4 res = simd_or(int4(1));
+  return res;
+}
+
+fragment void fragment_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_4d4eb0();
+  return;
+}
+
+kernel void compute_main(device int4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_4d4eb0();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.spvasm
new file mode 100644
index 0000000..36453d0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupOr_4d4eb0() -> vec4<i32> {
+  var res : vec4<i32> = subgroupOr(vec4<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.wgsl
new file mode 100644
index 0000000..aa36ddc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/4d4eb0.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupOr_4d4eb0() -> vec4<i32> {
+  var res : vec4<i32> = subgroupOr(vec4<i32>(1i));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl
new file mode 100644
index 0000000..527b609
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/663a21.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupOr(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupOr_663a21() -> vec3<u32>{
+  var res: vec3<u32> = subgroupOr(vec3<u32>(1u));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_663a21();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_663a21();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..1669bd9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupOr_663a21() {
+  uint3 res = WaveActiveBitOr((1u).xxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_663a21()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_663a21()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9f013ea
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupOr_663a21() {
+  uint3 res = WaveActiveBitOr((1u).xxx);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_663a21()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000244C44786C0(4,15-39): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.glsl
new file mode 100644
index 0000000..d5c45b4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupOr_663a21() -> vec3<u32> {
+  var res : vec3<u32> = subgroupOr(vec3<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_663a21();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..b5e20e1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint3 subgroupOr_663a21() {
+  uint3 res = WaveActiveBitOr((1u).xxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupOr_663a21());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, subgroupOr_663a21());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.ir.msl
new file mode 100644
index 0000000..1525688
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupOr_663a21() {
+  uint3 res = simd_or(uint3(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_663a21();
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_663a21();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..c5db461
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.ir.spvasm
@@ -0,0 +1,58 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_663a21 "subgroupOr_663a21"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_663a21 = OpFunction %v3uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function
+          %9 = OpGroupNonUniformBitwiseOr %v3uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v3uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v3uint %subgroupOr_663a21
+         %21 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %v3uint %subgroupOr_663a21
+         %27 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.msl
new file mode 100644
index 0000000..d4d6fcf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint3 subgroupOr_663a21() {
+  uint3 res = simd_or(uint3(1u));
+  return res;
+}
+
+fragment void fragment_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupOr_663a21());
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_uint3(subgroupOr_663a21());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.spvasm
new file mode 100644
index 0000000..8a12ea3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupOr_663a21() -> vec3<u32> {
+  var res : vec3<u32> = subgroupOr(vec3<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_663a21();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.wgsl
new file mode 100644
index 0000000..b48ff1e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/663a21.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupOr_663a21() -> vec3<u32> {
+  var res : vec3<u32> = subgroupOr(vec3<u32>(1u));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_663a21();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_663a21();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl
new file mode 100644
index 0000000..44b1d25
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupOr(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupOr_aa74f7() -> vec2<u32>{
+  var res: vec2<u32> = subgroupOr(vec2<u32>(1u));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..763c85d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupOr_aa74f7() {
+  uint2 res = WaveActiveBitOr((1u).xx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_aa74f7()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_aa74f7()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..df1e945
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupOr_aa74f7() {
+  uint2 res = WaveActiveBitOr((1u).xx);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_aa74f7()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001DAEF2F3690(4,15-38): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.glsl
new file mode 100644
index 0000000..d3340b6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupOr_aa74f7() -> vec2<u32> {
+  var res : vec2<u32> = subgroupOr(vec2<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..669f4ad
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint2 subgroupOr_aa74f7() {
+  uint2 res = WaveActiveBitOr((1u).xx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupOr_aa74f7());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, subgroupOr_aa74f7());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.ir.msl
new file mode 100644
index 0000000..3f2c33e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupOr_aa74f7() {
+  uint2 res = simd_or(uint2(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_aa74f7();
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_aa74f7();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..77776cb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.ir.spvasm
@@ -0,0 +1,58 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_aa74f7 "subgroupOr_aa74f7"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_aa74f7 = OpFunction %v2uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function
+          %9 = OpGroupNonUniformBitwiseOr %v2uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v2uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v2uint %subgroupOr_aa74f7
+         %21 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %v2uint %subgroupOr_aa74f7
+         %27 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.msl
new file mode 100644
index 0000000..3452b83
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint2 subgroupOr_aa74f7() {
+  uint2 res = simd_or(uint2(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_aa74f7();
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_aa74f7();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.spvasm
new file mode 100644
index 0000000..d79175a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupOr_aa74f7() -> vec2<u32> {
+  var res : vec2<u32> = subgroupOr(vec2<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.wgsl
new file mode 100644
index 0000000..aff1f8a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/aa74f7.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupOr_aa74f7() -> vec2<u32> {
+  var res : vec2<u32> = subgroupOr(vec2<u32>(1u));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl
new file mode 100644
index 0000000..41f1fdb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupOr(value: i32) -> i32
+fn subgroupOr_ae58b6() -> i32{
+  var res: i32 = subgroupOr(1i);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..5425d3b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupOr_ae58b6() {
+  int res = asint(WaveActiveBitOr(asuint(1)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_ae58b6()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_ae58b6()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2ec1e40
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupOr_ae58b6() {
+  int res = asint(WaveActiveBitOr(asuint(1)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_ae58b6()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001FF6F0986C0(4,19-44): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.glsl
new file mode 100644
index 0000000..33718af
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupOr_ae58b6() -> i32 {
+  var res : i32 = subgroupOr(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..b303460
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int subgroupOr_ae58b6() {
+  int res = asint(WaveActiveBitOr(asuint(1)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_ae58b6()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_ae58b6()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.ir.msl
new file mode 100644
index 0000000..3629a5e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupOr_ae58b6() {
+  int res = simd_or(1);
+  return res;
+}
+
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_ae58b6();
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_ae58b6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..bf9b09e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.ir.spvasm
@@ -0,0 +1,57 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_ae58b6 "subgroupOr_ae58b6"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_ae58b6 = OpFunction %int None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_int Function
+          %8 = OpGroupNonUniformBitwiseOr %int %uint_3 Reduce %int_1
+               OpStore %res %8
+         %14 = OpLoad %int %res
+               OpReturnValue %14
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %int %subgroupOr_ae58b6
+         %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %24 = OpLabel
+         %25 = OpFunctionCall %int %subgroupOr_ae58b6
+         %26 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %26 %25
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.msl
new file mode 100644
index 0000000..8d03798
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int subgroupOr_ae58b6() {
+  int res = simd_or(1);
+  return res;
+}
+
+fragment void fragment_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_ae58b6();
+  return;
+}
+
+kernel void compute_main(device int* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_ae58b6();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.spvasm
new file mode 100644
index 0000000..ea5034a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupOr_ae58b6() -> i32 {
+  var res : i32 = subgroupOr(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.wgsl
new file mode 100644
index 0000000..73f89b3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/ae58b6.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupOr_ae58b6() -> i32 {
+  var res : i32 = subgroupOr(1i);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl
new file mode 100644
index 0000000..5e88d6f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/f915e3.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupOr(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupOr_f915e3() -> vec4<u32>{
+  var res: vec4<u32> = subgroupOr(vec4<u32>(1u));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6fa839e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupOr_f915e3() {
+  uint4 res = WaveActiveBitOr((1u).xxxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_f915e3()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_f915e3()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..eb289f5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupOr_f915e3() {
+  uint4 res = WaveActiveBitOr((1u).xxxx);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_f915e3()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000214A6D31D70(4,15-40): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.glsl
new file mode 100644
index 0000000..f4c29f4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupOr_f915e3() -> vec4<u32> {
+  var res : vec4<u32> = subgroupOr(vec4<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..baf222f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint4 subgroupOr_f915e3() {
+  uint4 res = WaveActiveBitOr((1u).xxxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupOr_f915e3());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, subgroupOr_f915e3());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..708e5c2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupOr_f915e3() {
+  uint4 res = simd_or(uint4(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_f915e3();
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_f915e3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..afdf3a7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.ir.spvasm
@@ -0,0 +1,58 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_f915e3 "subgroupOr_f915e3"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_f915e3 = OpFunction %v4uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4uint Function
+          %9 = OpGroupNonUniformBitwiseOr %v4uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v4uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v4uint %subgroupOr_f915e3
+         %21 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %v4uint %subgroupOr_f915e3
+         %27 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.msl
new file mode 100644
index 0000000..66956e9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint4 subgroupOr_f915e3() {
+  uint4 res = simd_or(uint4(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_f915e3();
+  return;
+}
+
+kernel void compute_main(device uint4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_f915e3();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.spvasm
new file mode 100644
index 0000000..98c490b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupOr_f915e3() -> vec4<u32> {
+  var res : vec4<u32> = subgroupOr(vec4<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.wgsl
new file mode 100644
index 0000000..cb3ab36
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupOr/f915e3.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupOr_f915e3() -> vec4<u32> {
+  var res : vec4<u32> = subgroupOr(vec4<u32>(1u));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl
new file mode 100644
index 0000000..a3eb2bb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/468721.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupXor(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupXor_468721() -> vec3<u32>{
+  var res: vec3<u32> = subgroupXor(vec3<u32>(1u));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_468721();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_468721();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..23c44a5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupXor_468721() {
+  uint3 res = WaveActiveBitXor((1u).xxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_468721()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_468721()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..637f404
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupXor_468721() {
+  uint3 res = WaveActiveBitXor((1u).xxx);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_468721()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001CEE4B02460(4,15-40): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.glsl
new file mode 100644
index 0000000..9ad9a4c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupXor_468721() -> vec3<u32> {
+  var res : vec3<u32> = subgroupXor(vec3<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_468721();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..adb7970
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint3 subgroupXor_468721() {
+  uint3 res = WaveActiveBitXor((1u).xxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupXor_468721());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, subgroupXor_468721());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9d604b9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupXor_468721() {
+  uint3 res = simd_xor(uint3(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_468721();
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_468721();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..88262a7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.ir.spvasm
@@ -0,0 +1,58 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_468721 "subgroupXor_468721"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_468721 = OpFunction %v3uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function
+          %9 = OpGroupNonUniformBitwiseXor %v3uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v3uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v3uint %subgroupXor_468721
+         %21 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %v3uint %subgroupXor_468721
+         %27 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.msl
new file mode 100644
index 0000000..f5f8b05
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint3 subgroupXor_468721() {
+  uint3 res = simd_xor(uint3(1u));
+  return res;
+}
+
+fragment void fragment_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupXor_468721());
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_uint3(subgroupXor_468721());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.spvasm
new file mode 100644
index 0000000..4d3081c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupXor_468721() -> vec3<u32> {
+  var res : vec3<u32> = subgroupXor(vec3<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_468721();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.wgsl
new file mode 100644
index 0000000..d242689
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/468721.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupXor_468721() -> vec3<u32> {
+  var res : vec3<u32> = subgroupXor(vec3<u32>(1u));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_468721();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_468721();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl
new file mode 100644
index 0000000..96cb3bc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/473de8.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupXor(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupXor_473de8() -> vec2<i32>{
+  var res: vec2<i32> = subgroupXor(vec2<i32>(1i));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_473de8();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_473de8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b108199
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupXor_473de8() {
+  int2 tint_tmp = (1).xx;
+  int2 res = asint(WaveActiveBitXor(asuint(tint_tmp)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_473de8()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_473de8()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..938a026
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupXor_473de8() {
+  int2 tint_tmp = (1).xx;
+  int2 res = asint(WaveActiveBitXor(asuint(tint_tmp)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_473de8()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001EB105DF2E0(5,20-53): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.glsl
new file mode 100644
index 0000000..cbb2f4f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupXor_473de8() -> vec2<i32> {
+  var res : vec2<i32> = subgroupXor(vec2<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_473de8();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..69b8d09
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int2 subgroupXor_473de8() {
+  int2 arg = (1).xx;
+  int2 res = asint(WaveActiveBitXor(asuint(arg)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_473de8()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_473de8()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.ir.msl
new file mode 100644
index 0000000..58eccca
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupXor_473de8() {
+  int2 res = simd_xor(int2(1));
+  return res;
+}
+
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_473de8();
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_473de8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..96584f7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.ir.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_473de8 "subgroupXor_473de8"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_473de8 = OpFunction %v2int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2int Function
+          %9 = OpGroupNonUniformBitwiseXor %v2int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v2int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2int %subgroupXor_473de8
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %v2int %subgroupXor_473de8
+         %28 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.msl
new file mode 100644
index 0000000..2f76226
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int2 subgroupXor_473de8() {
+  int2 res = simd_xor(int2(1));
+  return res;
+}
+
+fragment void fragment_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_473de8();
+  return;
+}
+
+kernel void compute_main(device int2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_473de8();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.spvasm
new file mode 100644
index 0000000..5565553
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupXor_473de8() -> vec2<i32> {
+  var res : vec2<i32> = subgroupXor(vec2<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_473de8();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.wgsl
new file mode 100644
index 0000000..9c938db
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/473de8.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupXor_473de8() -> vec2<i32> {
+  var res : vec2<i32> = subgroupXor(vec2<i32>(1i));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_473de8();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_473de8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl
new file mode 100644
index 0000000..29d3bcf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/694b17.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupXor(value: i32) -> i32
+fn subgroupXor_694b17() -> i32{
+  var res: i32 = subgroupXor(1i);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_694b17();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_694b17();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a30a5ca
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupXor_694b17() {
+  int res = asint(WaveActiveBitXor(asuint(1)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_694b17()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_694b17()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9d90935
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupXor_694b17() {
+  int res = asint(WaveActiveBitXor(asuint(1)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_694b17()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000270803DB1B0(4,19-45): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.glsl
new file mode 100644
index 0000000..c04c501
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupXor_694b17() -> i32 {
+  var res : i32 = subgroupXor(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_694b17();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..a847ee9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int subgroupXor_694b17() {
+  int res = asint(WaveActiveBitXor(asuint(1)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_694b17()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_694b17()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.ir.msl
new file mode 100644
index 0000000..3e80e77
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupXor_694b17() {
+  int res = simd_xor(1);
+  return res;
+}
+
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_694b17();
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_694b17();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2fb7650
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.ir.spvasm
@@ -0,0 +1,57 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_694b17 "subgroupXor_694b17"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_694b17 = OpFunction %int None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_int Function
+          %8 = OpGroupNonUniformBitwiseXor %int %uint_3 Reduce %int_1
+               OpStore %res %8
+         %14 = OpLoad %int %res
+               OpReturnValue %14
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %int %subgroupXor_694b17
+         %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %24 = OpLabel
+         %25 = OpFunctionCall %int %subgroupXor_694b17
+         %26 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %26 %25
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.msl
new file mode 100644
index 0000000..7731b77
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int subgroupXor_694b17() {
+  int res = simd_xor(1);
+  return res;
+}
+
+fragment void fragment_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_694b17();
+  return;
+}
+
+kernel void compute_main(device int* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_694b17();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.spvasm
new file mode 100644
index 0000000..da2b194
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupXor_694b17() -> i32 {
+  var res : i32 = subgroupXor(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_694b17();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.wgsl
new file mode 100644
index 0000000..cfb58a2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/694b17.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupXor_694b17() -> i32 {
+  var res : i32 = subgroupXor(1i);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_694b17();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_694b17();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl
new file mode 100644
index 0000000..558bdcf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7750d6.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupXor(value: u32) -> u32
+fn subgroupXor_7750d6() -> u32{
+  var res: u32 = subgroupXor(1u);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8f4d990
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupXor_7750d6() {
+  uint res = WaveActiveBitXor(1u);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_7750d6()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_7750d6()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..42110f2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupXor_7750d6() {
+  uint res = WaveActiveBitXor(1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_7750d6()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000017025E7FFC0(4,14-33): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.glsl
new file mode 100644
index 0000000..b320043
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupXor_7750d6() -> u32 {
+  var res : u32 = subgroupXor(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..f4950fc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint subgroupXor_7750d6() {
+  uint res = WaveActiveBitXor(1u);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupXor_7750d6());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, subgroupXor_7750d6());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.ir.msl
new file mode 100644
index 0000000..38aa27c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupXor_7750d6() {
+  uint res = simd_xor(1u);
+  return res;
+}
+
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_7750d6();
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_7750d6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b8bf9bb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_7750d6 "subgroupXor_7750d6"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_7750d6 = OpFunction %uint None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function
+          %8 = OpGroupNonUniformBitwiseXor %uint %uint_3 Reduce %uint_1
+               OpStore %res %8
+         %13 = OpLoad %uint %res
+               OpReturnValue %13
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %16
+         %17 = OpLabel
+         %18 = OpFunctionCall %uint %subgroupXor_7750d6
+         %19 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %19 %18
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %16
+         %23 = OpLabel
+         %24 = OpFunctionCall %uint %subgroupXor_7750d6
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %25 %24
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.msl
new file mode 100644
index 0000000..e291fdb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint subgroupXor_7750d6() {
+  uint res = simd_xor(1u);
+  return res;
+}
+
+fragment void fragment_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_7750d6();
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_7750d6();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.spvasm
new file mode 100644
index 0000000..da22104
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupXor_7750d6() -> u32 {
+  var res : u32 = subgroupXor(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.wgsl
new file mode 100644
index 0000000..3b1c907a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7750d6.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupXor_7750d6() -> u32 {
+  var res : u32 = subgroupXor(1u);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl
new file mode 100644
index 0000000..fa1ef2f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7f6672.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupXor(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupXor_7f6672() -> vec2<u32>{
+  var res: vec2<u32> = subgroupXor(vec2<u32>(1u));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9be1273
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupXor_7f6672() {
+  uint2 res = WaveActiveBitXor((1u).xx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_7f6672()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_7f6672()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..209a110
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupXor_7f6672() {
+  uint2 res = WaveActiveBitXor((1u).xx);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_7f6672()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001D2005F1400(4,15-39): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.glsl
new file mode 100644
index 0000000..769a159
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupXor_7f6672() -> vec2<u32> {
+  var res : vec2<u32> = subgroupXor(vec2<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..ec96b01
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint2 subgroupXor_7f6672() {
+  uint2 res = WaveActiveBitXor((1u).xx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupXor_7f6672());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, subgroupXor_7f6672());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.ir.msl
new file mode 100644
index 0000000..4d00573
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupXor_7f6672() {
+  uint2 res = simd_xor(uint2(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_7f6672();
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_7f6672();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6a5ebc7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.ir.spvasm
@@ -0,0 +1,58 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_7f6672 "subgroupXor_7f6672"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_7f6672 = OpFunction %v2uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function
+          %9 = OpGroupNonUniformBitwiseXor %v2uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v2uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v2uint %subgroupXor_7f6672
+         %21 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %v2uint %subgroupXor_7f6672
+         %27 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.msl
new file mode 100644
index 0000000..bfe82aa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint2 subgroupXor_7f6672() {
+  uint2 res = simd_xor(uint2(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_7f6672();
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_7f6672();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.spvasm
new file mode 100644
index 0000000..148907c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupXor_7f6672() -> vec2<u32> {
+  var res : vec2<u32> = subgroupXor(vec2<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.wgsl
new file mode 100644
index 0000000..7f5787d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/7f6672.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupXor_7f6672() -> vec2<u32> {
+  var res : vec2<u32> = subgroupXor(vec2<u32>(1u));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl
new file mode 100644
index 0000000..23da774
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupXor(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupXor_83b1f3() -> vec4<i32>{
+  var res: vec4<i32> = subgroupXor(vec4<i32>(1i));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4c7fc47
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupXor_83b1f3() {
+  int4 tint_tmp = (1).xxxx;
+  int4 res = asint(WaveActiveBitXor(asuint(tint_tmp)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_83b1f3()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_83b1f3()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..30c49f9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupXor_83b1f3() {
+  int4 tint_tmp = (1).xxxx;
+  int4 res = asint(WaveActiveBitXor(asuint(tint_tmp)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_83b1f3()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001562F474130(5,20-53): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.glsl
new file mode 100644
index 0000000..95734ab
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupXor_83b1f3() -> vec4<i32> {
+  var res : vec4<i32> = subgroupXor(vec4<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..778f7b0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int4 subgroupXor_83b1f3() {
+  int4 arg = (1).xxxx;
+  int4 res = asint(WaveActiveBitXor(asuint(arg)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_83b1f3()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_83b1f3()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9ed3cd6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupXor_83b1f3() {
+  int4 res = simd_xor(int4(1));
+  return res;
+}
+
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_83b1f3();
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_83b1f3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..dae5ee8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.ir.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_83b1f3 "subgroupXor_83b1f3"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_83b1f3 = OpFunction %v4int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4int Function
+          %9 = OpGroupNonUniformBitwiseXor %v4int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v4int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4int %subgroupXor_83b1f3
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %v4int %subgroupXor_83b1f3
+         %28 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.msl
new file mode 100644
index 0000000..8c463c7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int4 subgroupXor_83b1f3() {
+  int4 res = simd_xor(int4(1));
+  return res;
+}
+
+fragment void fragment_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_83b1f3();
+  return;
+}
+
+kernel void compute_main(device int4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_83b1f3();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.spvasm
new file mode 100644
index 0000000..7fef857
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupXor_83b1f3() -> vec4<i32> {
+  var res : vec4<i32> = subgroupXor(vec4<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.wgsl
new file mode 100644
index 0000000..1918966
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/83b1f3.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupXor_83b1f3() -> vec4<i32> {
+  var res : vec4<i32> = subgroupXor(vec4<i32>(1i));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl
new file mode 100644
index 0000000..a5dc431
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupXor(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupXor_9c6e73() -> vec3<i32>{
+  var res: vec3<i32> = subgroupXor(vec3<i32>(1i));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e3104d3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupXor_9c6e73() {
+  int3 tint_tmp = (1).xxx;
+  int3 res = asint(WaveActiveBitXor(asuint(tint_tmp)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_9c6e73()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_9c6e73()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0d9f24d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupXor_9c6e73() {
+  int3 tint_tmp = (1).xxx;
+  int3 res = asint(WaveActiveBitXor(asuint(tint_tmp)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_9c6e73()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001B02A250E00(5,20-53): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.glsl
new file mode 100644
index 0000000..e153160
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupXor_9c6e73() -> vec3<i32> {
+  var res : vec3<i32> = subgroupXor(vec3<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..d421ffa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int3 subgroupXor_9c6e73() {
+  int3 arg = (1).xxx;
+  int3 res = asint(WaveActiveBitXor(asuint(arg)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_9c6e73()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_9c6e73()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.ir.msl
new file mode 100644
index 0000000..183287c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupXor_9c6e73() {
+  int3 res = simd_xor(int3(1));
+  return res;
+}
+
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_9c6e73();
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_9c6e73();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..62cff51
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.ir.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_9c6e73 "subgroupXor_9c6e73"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_9c6e73 = OpFunction %v3int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3int Function
+          %9 = OpGroupNonUniformBitwiseXor %v3int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v3int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3int %subgroupXor_9c6e73
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %v3int %subgroupXor_9c6e73
+         %28 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.msl
new file mode 100644
index 0000000..65c7f33
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int3 subgroupXor_9c6e73() {
+  int3 res = simd_xor(int3(1));
+  return res;
+}
+
+fragment void fragment_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupXor_9c6e73());
+  return;
+}
+
+kernel void compute_main(device packed_int3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_int3(subgroupXor_9c6e73());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.spvasm
new file mode 100644
index 0000000..ca8699d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupXor_9c6e73() -> vec3<i32> {
+  var res : vec3<i32> = subgroupXor(vec3<i32>(1i));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.wgsl
new file mode 100644
index 0000000..4a91638
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9c6e73.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupXor_9c6e73() -> vec3<i32> {
+  var res : vec3<i32> = subgroupXor(vec3<i32>(1i));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl
new file mode 100644
index 0000000..6e3bfda
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupXor(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupXor_9d77e4() -> vec4<u32>{
+  var res: vec4<u32> = subgroupXor(vec4<u32>(1u));
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b7e23dc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupXor_9d77e4() {
+  uint4 res = WaveActiveBitXor((1u).xxxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_9d77e4()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_9d77e4()));
+  return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6cc915a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupXor_9d77e4() {
+  uint4 res = WaveActiveBitXor((1u).xxxx);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_9d77e4()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001B889021E80(4,15-41): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.glsl
new file mode 100644
index 0000000..107edee
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.glsl
@@ -0,0 +1,21 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupXor_9d77e4() -> vec4<u32> {
+  var res : vec4<u32> = subgroupXor(vec4<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..c98629f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint4 subgroupXor_9d77e4() {
+  uint4 res = WaveActiveBitXor((1u).xxxx);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupXor_9d77e4());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, subgroupXor_9d77e4());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.ir.msl
new file mode 100644
index 0000000..d34c3c4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupXor_9d77e4() {
+  uint4 res = simd_xor(uint4(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_9d77e4();
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_9d77e4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..06bf6c0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.ir.spvasm
@@ -0,0 +1,58 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_9d77e4 "subgroupXor_9d77e4"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_9d77e4 = OpFunction %v4uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4uint Function
+          %9 = OpGroupNonUniformBitwiseXor %v4uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v4uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v4uint %subgroupXor_9d77e4
+         %21 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %v4uint %subgroupXor_9d77e4
+         %27 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.msl
new file mode 100644
index 0000000..456b971
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint4 subgroupXor_9d77e4() {
+  uint4 res = simd_xor(uint4(1u));
+  return res;
+}
+
+fragment void fragment_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_9d77e4();
+  return;
+}
+
+kernel void compute_main(device uint4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_9d77e4();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.spvasm
new file mode 100644
index 0000000..3ea792d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupXor_9d77e4() -> vec4<u32> {
+  var res : vec4<u32> = subgroupXor(vec4<u32>(1u));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.wgsl
new file mode 100644
index 0000000..d000de2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupXor/9d77e4.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupXor_9d77e4() -> vec4<u32> {
+  var res : vec4<u32> = subgroupXor(vec4<u32>(1u));
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
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
index b77eca1..6526b51 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupAdd_0dd12a());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000016724106660(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.dxc.hlsl
index 13b6848..985b39c 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupAdd_0dd12a());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupAdd_0dd12a());
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.msl
index 4271282..c9e7940 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_0dd12a();
+}
+
 kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_0dd12a();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl
index 2fa582a..04c19e1 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupAdd_1280c8()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002CC18BBFCC0(5,15-34): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.dxc.hlsl
index 817f839..e3424e7 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupAdd_1280c8());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, subgroupAdd_1280c8());
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.msl
index 11e0e47..c8db9c4 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_1280c8();
+}
+
 kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_1280c8();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl
index a71e443..2f3bfca 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupAdd_1eb429()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000228FD2163D0(5,14-33): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.dxc.hlsl
index ea01da3..d86da54 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAdd_1eb429()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupAdd_1eb429()));
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.msl
index 98f4590..a0cd6c4 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_1eb429();
+}
+
 kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_1eb429();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.fxc.hlsl
index 1d5cf1d..ab34301 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<float16_t>(0u, subgroupAdd_225207());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000026C96842240(3,1-9): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.dxc.hlsl
index f385ebd..715dfe5 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupAdd_225207());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<float16_t>(0u, subgroupAdd_225207());
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.msl
index d99ff30..02a6b19 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_225207();
+}
+
 kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_225207();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.fxc.hlsl
index d9abb91..d60d8d3 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupAdd_22d041()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000281DEC92CF0(5,14-33): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.dxc.hlsl
index 50a0929..d70eec3 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAdd_22d041()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupAdd_22d041()));
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.msl
index d5374c0..1d78e1f 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_22d041();
+}
+
 kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_22d041();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl
index 45e3972..af14f6c 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupAdd_28db2c()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000019DD2C63750(5,14-33): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.dxc.hlsl
index 08e9a70..d13d3d9 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAdd_28db2c()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupAdd_28db2c()));
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.msl
index 948e5a0..398da3e 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_28db2c();
+}
+
 kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_28db2c();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl
index 1294512..d12f885 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupAdd_2ab40a());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001AF7F43CA40(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.dxc.hlsl
index 5cb4b59..8aeca61 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupAdd_2ab40a());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupAdd_2ab40a());
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.msl
index fa53f0d..5293acc 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_2ab40a();
+}
+
 kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_2ab40a();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl
index b7ab92f..5d3f336 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupAdd_3854ae()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000023728F093C0(5,15-34): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.dxc.hlsl
index 90a7117..65dc7bf 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupAdd_3854ae()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupAdd_3854ae()));
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.msl
index ff5d336..c7e6977 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_3854ae();
+}
+
 kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_3854ae();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl
index 501c1f2..c74ace4 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupAdd_6587ff()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001AB9FDFEBE0(5,15-34): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.dxc.hlsl
index 83f0652..7b0fc31 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupAdd_6587ff());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, subgroupAdd_6587ff());
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.msl
index dfbb76d..008e6fc 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_6587ff();
+}
+
 kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_6587ff();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl
index 90ae534..2efd9d1 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupAdd_7d1215()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000022CB470F2E0(5,16-35): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.dxc.hlsl
index dad80ff..fd04891 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAdd_7d1215()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupAdd_7d1215()));
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.msl
index 7355d22..08506b1 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_7d1215();
+}
+
 kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_7d1215();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl
index 988e73c..cb24be4 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupAdd_8f4c15()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000024228742450(5,16-35): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.dxc.hlsl
index 19e2c2e..a05d794 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAdd_8f4c15()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupAdd_8f4c15()));
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.msl
index ce4100f..ea69b03 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_8f4c15();
+}
+
 kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_8f4c15();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl
index 511a7274b..4882e88 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupAdd_b61df7()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001AD75DCE340(5,14-33): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.dxc.hlsl
index 573cd23..4d71eed 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupAdd_b61df7());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, subgroupAdd_b61df7());
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.msl
index 53e7014..f9c8488 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_b61df7();
+}
+
 kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_b61df7();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl
index 236b886..44bb6f4 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupAdd_ba53f9()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001DAD6877D80(5,13-32): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.dxc.hlsl
index ed359ab..14c9944 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupAdd_ba53f9()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupAdd_ba53f9()));
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.msl
index fe287af..cf32f18 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_ba53f9();
+}
+
 kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_ba53f9();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl
index 9fc516d..cd6ebb7 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupAdd_cae1ed());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000029DB8637E60(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.dxc.hlsl
index 00010f4..c20f467 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupAdd_cae1ed());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupAdd_cae1ed());
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.msl
index 499801a..86be56c 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_cae1ed();
+}
+
 kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_cae1ed();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl
index 66d1964..54e780b 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupAdd_dcf73f()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000018791DB7DD0(5,16-35): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.dxc.hlsl
index 20cd198..cb59d4a 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAdd_dcf73f()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupAdd_dcf73f()));
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.msl
index 93e7f0f..b68c8a7 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_dcf73f();
+}
+
 kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_dcf73f();
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl
index a662594..4835cbe 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupAdd_fbc357()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000028641012BE0(5,15-34): error X3004: undeclared identifier 'WaveActiveSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.dxc.hlsl
index 2dd32b6..20a127b 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupAdd_fbc357());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupAdd_fbc357());
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.msl
index 38f63a3..a791748 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_fbc357();
+}
+
 kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupAdd_fbc357();
diff --git a/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl
new file mode 100644
index 0000000..dfdd927
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupAnd(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupAnd_1877b3() -> vec3<i32>{
+  var arg_0 = vec3<i32>(1i);
+  var res: vec3<i32> = subgroupAnd(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e366cc9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupAnd_1877b3() {
+  int3 arg_0 = (1).xxx;
+  int3 res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_1877b3()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_1877b3()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..38424dc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupAnd_1877b3() {
+  int3 arg_0 = (1).xxx;
+  int3 res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_1877b3()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002D167C11700(5,20-50): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.glsl
new file mode 100644
index 0000000..ffa9999
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupAnd_1877b3() -> vec3<i32> {
+  var arg_0 = vec3<i32>(1i);
+  var res : vec3<i32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..6f2eb87
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int3 subgroupAnd_1877b3() {
+  int3 arg_0 = (1).xxx;
+  int3 res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_1877b3()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_1877b3()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e22f9b5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupAnd_1877b3() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_1877b3();
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_1877b3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..188e310
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.ir.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_1877b3 "subgroupAnd_1877b3"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_1877b3 = 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 = OpGroupNonUniformBitwiseAnd %v3int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v3int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3int %subgroupAnd_1877b3
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %28 = OpLabel
+         %29 = OpFunctionCall %v3int %subgroupAnd_1877b3
+         %30 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %30 %29
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.msl
new file mode 100644
index 0000000..4a23bc0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int3 subgroupAnd_1877b3() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupAnd_1877b3());
+  return;
+}
+
+kernel void compute_main(device packed_int3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_int3(subgroupAnd_1877b3());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.spvasm
new file mode 100644
index 0000000..f8839b1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupAnd_1877b3() -> vec3<i32> {
+  var arg_0 = vec3<i32>(1i);
+  var res : vec3<i32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.wgsl
new file mode 100644
index 0000000..de30b73
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/1877b3.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupAnd_1877b3() -> vec3<i32> {
+  var arg_0 = vec3<i32>(1i);
+  var res : vec3<i32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_1877b3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl
new file mode 100644
index 0000000..e0e42ad
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupAnd(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupAnd_376802() -> vec2<u32>{
+  var arg_0 = vec2<u32>(1u);
+  var res: vec2<u32> = subgroupAnd(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_376802();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_376802();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..337b583
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupAnd_376802() {
+  uint2 arg_0 = (1u).xx;
+  uint2 res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_376802()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_376802()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..4614ed6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupAnd_376802() {
+  uint2 arg_0 = (1u).xx;
+  uint2 res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_376802()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002C13E4828F0(5,15-37): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.glsl
new file mode 100644
index 0000000..dd05f02
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupAnd_376802() -> vec2<u32> {
+  var arg_0 = vec2<u32>(1u);
+  var res : vec2<u32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_376802();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..deaa0cc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint2 subgroupAnd_376802() {
+  uint2 arg_0 = (1u).xx;
+  uint2 res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupAnd_376802());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, subgroupAnd_376802());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e3bd1c4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupAnd_376802() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_376802();
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_376802();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6c45652
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_376802 "subgroupAnd_376802"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_376802 = 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 = OpGroupNonUniformBitwiseAnd %v2uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v2uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v2uint %subgroupAnd_376802
+         %23 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %27 = OpLabel
+         %28 = OpFunctionCall %v2uint %subgroupAnd_376802
+         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %29 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.msl
new file mode 100644
index 0000000..64195eb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint2 subgroupAnd_376802() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_376802();
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_376802();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.spvasm
new file mode 100644
index 0000000..be05ae7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupAnd_376802() -> vec2<u32> {
+  var arg_0 = vec2<u32>(1u);
+  var res : vec2<u32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_376802();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.wgsl
new file mode 100644
index 0000000..5b24fa4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/376802.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupAnd_376802() -> vec2<u32> {
+  var arg_0 = vec2<u32>(1u);
+  var res : vec2<u32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_376802();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_376802();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl
new file mode 100644
index 0000000..642acfc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupAnd(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupAnd_4adc72() -> vec2<i32>{
+  var arg_0 = vec2<i32>(1i);
+  var res: vec2<i32> = subgroupAnd(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6702510
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupAnd_4adc72() {
+  int2 arg_0 = (1).xx;
+  int2 res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_4adc72()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_4adc72()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..ea0a82f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupAnd_4adc72() {
+  int2 arg_0 = (1).xx;
+  int2 res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_4adc72()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001D7E87F1CA0(5,20-50): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.glsl
new file mode 100644
index 0000000..5ad037b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupAnd_4adc72() -> vec2<i32> {
+  var arg_0 = vec2<i32>(1i);
+  var res : vec2<i32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..20ed017
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int2 subgroupAnd_4adc72() {
+  int2 arg_0 = (1).xx;
+  int2 res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_4adc72()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupAnd_4adc72()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e466779
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupAnd_4adc72() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_4adc72();
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_4adc72();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..70c0085
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.ir.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_4adc72 "subgroupAnd_4adc72"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_4adc72 = 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 = OpGroupNonUniformBitwiseAnd %v2int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v2int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2int %subgroupAnd_4adc72
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %28 = OpLabel
+         %29 = OpFunctionCall %v2int %subgroupAnd_4adc72
+         %30 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %30 %29
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.msl
new file mode 100644
index 0000000..623ed5c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int2 subgroupAnd_4adc72() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_4adc72();
+  return;
+}
+
+kernel void compute_main(device int2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_4adc72();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.spvasm
new file mode 100644
index 0000000..9f5c58e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupAnd_4adc72() -> vec2<i32> {
+  var arg_0 = vec2<i32>(1i);
+  var res : vec2<i32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.wgsl
new file mode 100644
index 0000000..3d0ef1c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4adc72.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupAnd_4adc72() -> vec2<i32> {
+  var arg_0 = vec2<i32>(1i);
+  var res : vec2<i32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4adc72();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl
new file mode 100644
index 0000000..8f8ad25
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupAnd(value: u32) -> u32
+fn subgroupAnd_4df632() -> u32{
+  var arg_0 = 1u;
+  var res: u32 = subgroupAnd(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..5632dc5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupAnd_4df632() {
+  uint arg_0 = 1u;
+  uint res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_4df632()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_4df632()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..810be0a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupAnd_4df632() {
+  uint arg_0 = 1u;
+  uint res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_4df632()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001DBF3300A70(5,14-36): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.glsl
new file mode 100644
index 0000000..bd4f976
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAnd_4df632() -> u32 {
+  var arg_0 = 1u;
+  var res : u32 = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..f9a5a53
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint subgroupAnd_4df632() {
+  uint arg_0 = 1u;
+  uint res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupAnd_4df632());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, subgroupAnd_4df632());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.ir.msl
new file mode 100644
index 0000000..c05a0ae
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupAnd_4df632() {
+  uint arg_0 = 1u;
+  uint res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_4df632();
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_4df632();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..1cba37b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.ir.spvasm
@@ -0,0 +1,60 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_4df632 "subgroupAnd_4df632"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_4df632 = 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 = OpGroupNonUniformBitwiseAnd %uint %uint_3 Reduce %11
+               OpStore %res %12
+         %15 = OpLoad %uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %uint %subgroupAnd_4df632
+         %21 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %uint %subgroupAnd_4df632
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.msl
new file mode 100644
index 0000000..8434859
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint subgroupAnd_4df632() {
+  uint arg_0 = 1u;
+  uint res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_4df632();
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_4df632();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.spvasm
new file mode 100644
index 0000000..a199f01
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAnd_4df632() -> u32 {
+  var arg_0 = 1u;
+  var res : u32 = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.wgsl
new file mode 100644
index 0000000..dc30c85
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/4df632.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAnd_4df632() -> u32 {
+  var arg_0 = 1u;
+  var res : u32 = subgroupAnd(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_4df632();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl
new file mode 100644
index 0000000..0cfabe7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupAnd(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupAnd_97655b() -> vec4<i32>{
+  var arg_0 = vec4<i32>(1i);
+  var res: vec4<i32> = subgroupAnd(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..5dd49cc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupAnd_97655b() {
+  int4 arg_0 = (1).xxxx;
+  int4 res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_97655b()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_97655b()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e89825f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupAnd_97655b() {
+  int4 arg_0 = (1).xxxx;
+  int4 res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_97655b()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000147CD86DCC0(5,20-50): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.glsl
new file mode 100644
index 0000000..4dee6bf
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupAnd_97655b() -> vec4<i32> {
+  var arg_0 = vec4<i32>(1i);
+  var res : vec4<i32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..94e0856
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int4 subgroupAnd_97655b() {
+  int4 arg_0 = (1).xxxx;
+  int4 res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_97655b()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_97655b()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.ir.msl
new file mode 100644
index 0000000..570b329
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupAnd_97655b() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_97655b();
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_97655b();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..5e68065
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.ir.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_97655b "subgroupAnd_97655b"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_97655b = 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 = OpGroupNonUniformBitwiseAnd %v4int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v4int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4int %subgroupAnd_97655b
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %28 = OpLabel
+         %29 = OpFunctionCall %v4int %subgroupAnd_97655b
+         %30 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %30 %29
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.msl
new file mode 100644
index 0000000..74d567b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int4 subgroupAnd_97655b() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_97655b();
+  return;
+}
+
+kernel void compute_main(device int4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_97655b();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.spvasm
new file mode 100644
index 0000000..0ab2a77
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupAnd_97655b() -> vec4<i32> {
+  var arg_0 = vec4<i32>(1i);
+  var res : vec4<i32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.wgsl
new file mode 100644
index 0000000..3ee347d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/97655b.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupAnd_97655b() -> vec4<i32> {
+  var arg_0 = vec4<i32>(1i);
+  var res : vec4<i32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_97655b();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl
new file mode 100644
index 0000000..e05cdcf
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupAnd(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupAnd_ad0cd3() -> vec3<u32>{
+  var arg_0 = vec3<u32>(1u);
+  var res: vec3<u32> = subgroupAnd(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b218642
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupAnd_ad0cd3() {
+  uint3 arg_0 = (1u).xxx;
+  uint3 res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_ad0cd3()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_ad0cd3()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8b0a69e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupAnd_ad0cd3() {
+  uint3 arg_0 = (1u).xxx;
+  uint3 res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupAnd_ad0cd3()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000208C8E8C5A0(5,15-37): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.glsl
new file mode 100644
index 0000000..9f7c3f2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupAnd_ad0cd3() -> vec3<u32> {
+  var arg_0 = vec3<u32>(1u);
+  var res : vec3<u32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..7c1bc01
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint3 subgroupAnd_ad0cd3() {
+  uint3 arg_0 = (1u).xxx;
+  uint3 res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupAnd_ad0cd3());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, subgroupAnd_ad0cd3());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..b21bc35
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupAnd_ad0cd3() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_ad0cd3();
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_ad0cd3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..09110ed
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_ad0cd3 "subgroupAnd_ad0cd3"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_ad0cd3 = 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 = OpGroupNonUniformBitwiseAnd %v3uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v3uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v3uint %subgroupAnd_ad0cd3
+         %23 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %27 = OpLabel
+         %28 = OpFunctionCall %v3uint %subgroupAnd_ad0cd3
+         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %29 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.msl
new file mode 100644
index 0000000..2752ea7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint3 subgroupAnd_ad0cd3() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupAnd_ad0cd3());
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_uint3(subgroupAnd_ad0cd3());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.spvasm
new file mode 100644
index 0000000..db74819
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupAnd_ad0cd3() -> vec3<u32> {
+  var arg_0 = vec3<u32>(1u);
+  var res : vec3<u32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.wgsl
new file mode 100644
index 0000000..db13754
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/ad0cd3.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupAnd_ad0cd3() -> vec3<u32> {
+  var arg_0 = vec3<u32>(1u);
+  var res : vec3<u32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_ad0cd3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl
new file mode 100644
index 0000000..da7b71e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupAnd(value: i32) -> i32
+fn subgroupAnd_c6fc92() -> i32{
+  var arg_0 = 1i;
+  var res: i32 = subgroupAnd(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4bc62c6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupAnd_c6fc92() {
+  int arg_0 = 1;
+  int res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_c6fc92()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_c6fc92()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6cff6fd
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupAnd_c6fc92() {
+  int arg_0 = 1;
+  int res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_c6fc92()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000136FE991080(5,19-49): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.glsl
new file mode 100644
index 0000000..11d9714
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAnd_c6fc92() -> i32 {
+  var arg_0 = 1i;
+  var res : i32 = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..1914e32
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int subgroupAnd_c6fc92() {
+  int arg_0 = 1;
+  int res = asint(WaveActiveBitAnd(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_c6fc92()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupAnd_c6fc92()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.ir.msl
new file mode 100644
index 0000000..02a2e08
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupAnd_c6fc92() {
+  int arg_0 = 1;
+  int res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_c6fc92();
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_c6fc92();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..585dd484
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.ir.spvasm
@@ -0,0 +1,61 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_c6fc92 "subgroupAnd_c6fc92"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_c6fc92 = 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 = OpGroupNonUniformBitwiseAnd %int %uint_3 Reduce %11
+               OpStore %res %12
+         %16 = OpLoad %int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %int %subgroupAnd_c6fc92
+         %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %int %subgroupAnd_c6fc92
+         %28 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.msl
new file mode 100644
index 0000000..e5b2606
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int subgroupAnd_c6fc92() {
+  int arg_0 = 1;
+  int res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_c6fc92();
+  return;
+}
+
+kernel void compute_main(device int* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_c6fc92();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.spvasm
new file mode 100644
index 0000000..396727e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAnd_c6fc92() -> i32 {
+  var arg_0 = 1i;
+  var res : i32 = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.wgsl
new file mode 100644
index 0000000..f910b3b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/c6fc92.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAnd_c6fc92() -> i32 {
+  var arg_0 = 1i;
+  var res : i32 = subgroupAnd(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_c6fc92();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl
new file mode 100644
index 0000000..1931d63
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupAnd(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupAnd_d2c9a6() -> vec4<u32>{
+  var arg_0 = vec4<u32>(1u);
+  var res: vec4<u32> = subgroupAnd(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d0ea6a3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupAnd_d2c9a6() {
+  uint4 arg_0 = (1u).xxxx;
+  uint4 res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_d2c9a6()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_d2c9a6()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8f4fcbf
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupAnd_d2c9a6() {
+  uint4 arg_0 = (1u).xxxx;
+  uint4 res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupAnd_d2c9a6()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002CB4B9D1740(5,15-37): error X3004: undeclared identifier 'WaveActiveBitAnd'
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.glsl
new file mode 100644
index 0000000..a51d0ee
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupAnd_d2c9a6() -> vec4<u32> {
+  var arg_0 = vec4<u32>(1u);
+  var res : vec4<u32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..b83d8f3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint4 subgroupAnd_d2c9a6() {
+  uint4 arg_0 = (1u).xxxx;
+  uint4 res = WaveActiveBitAnd(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupAnd_d2c9a6());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, subgroupAnd_d2c9a6());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.ir.msl
new file mode 100644
index 0000000..bc1970c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupAnd_d2c9a6() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_d2c9a6();
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAnd_d2c9a6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..a759c9a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAnd_d2c9a6 "subgroupAnd_d2c9a6"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupAnd_d2c9a6 = 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 = OpGroupNonUniformBitwiseAnd %v4uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v4uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v4uint %subgroupAnd_d2c9a6
+         %23 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %27 = OpLabel
+         %28 = OpFunctionCall %v4uint %subgroupAnd_d2c9a6
+         %29 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %29 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.msl
new file mode 100644
index 0000000..f6c3e388
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint4 subgroupAnd_d2c9a6() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_and(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAnd_d2c9a6();
+  return;
+}
+
+kernel void compute_main(device uint4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupAnd_d2c9a6();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.spvasm
new file mode 100644
index 0000000..abf6066
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupAnd_d2c9a6() -> vec4<u32> {
+  var arg_0 = vec4<u32>(1u);
+  var res : vec4<u32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.wgsl
new file mode 100644
index 0000000..9f3d936
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAnd/d2c9a6.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupAnd_d2c9a6() -> vec4<u32> {
+  var arg_0 = vec4<u32>(1u);
+  var res : vec4<u32> = subgroupAnd(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAnd_d2c9a6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBallot/1a8251.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBallot/1a8251.wgsl.expected.fxc.hlsl
index 1f17fde..9da5773 100644
--- a/test/tint/builtins/gen/var/subgroupBallot/1a8251.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBallot/1a8251.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupBallot_1a8251()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000216ACDFD010(5,15-37): error X3004: undeclared identifier 'WaveActiveBallot'
+
diff --git a/test/tint/builtins/gen/var/subgroupBallot/1a8251.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBallot/1a8251.wgsl.expected.ir.dxc.hlsl
index 993e0e9..a5356af 100644
--- a/test/tint/builtins/gen/var/subgroupBallot/1a8251.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBallot/1a8251.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupBallot_1a8251());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupBallot_1a8251());
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.fxc.hlsl
index 9f667dd..f0994ff 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float16_t subgroupBroadcast_07e2d8() {
+  float16_t arg_0 = float16_t(1.0h);
+  float16_t res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupBroadcast_07e2d8());
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001DDF4F1F440(3,1-9): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.ir.dxc.hlsl
index 22d01a8..d7a8e11 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupBroadcast_07e2d8());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<float16_t>(0u, subgroupBroadcast_07e2d8());
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.fxc.hlsl
index 9f667dd..12cce6d 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float subgroupBroadcast_08beca() {
+  float arg_0 = 1.0f;
+  float res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupBroadcast_08beca()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000260FE0CC900(5,15-39): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.ir.dxc.hlsl
index 347c80c..10c16fd 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupBroadcast_08beca()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupBroadcast_08beca()));
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.fxc.hlsl
index 9f667dd..10ba6f1 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 4> subgroupBroadcast_0f44e2() {
+  vector<float16_t, 4> arg_0 = (float16_t(1.0h)).xxxx;
+  vector<float16_t, 4> res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcast_0f44e2());
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000166868CD1D0(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.ir.dxc.hlsl
index 4584bbd..4ed4fe8 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcast_0f44e2());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcast_0f44e2());
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.fxc.hlsl
index 9f667dd..a21bd33 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 2> subgroupBroadcast_13f36c() {
+  vector<float16_t, 2> arg_0 = (float16_t(1.0h)).xx;
+  vector<float16_t, 2> res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcast_13f36c());
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001FD198BD1D0(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.ir.dxc.hlsl
index aea3235..c739271 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcast_13f36c());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcast_13f36c());
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.fxc.hlsl
index 9f667dd..45e9a82 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupBroadcast_1d79c7() {
+  int arg_0 = 1;
+  int res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupBroadcast_1d79c7()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002205DFD0120(5,13-37): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.ir.dxc.hlsl
index 5fab837..f5dbb2d 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupBroadcast_1d79c7()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupBroadcast_1d79c7()));
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.fxc.hlsl
index 9f667dd..a58fe8f 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupBroadcast_279027() {
+  uint4 arg_0 = (1u).xxxx;
+  uint4 res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupBroadcast_279027()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000024CFF3BFD20(5,15-39): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.ir.dxc.hlsl
index cd78746..57ff7b4 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupBroadcast_279027());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupBroadcast_279027());
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.fxc.hlsl
index 9f667dd..6407ed3 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupBroadcast_34fa3d() {
+  uint3 arg_0 = (1u).xxx;
+  uint3 res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupBroadcast_34fa3d()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002345F903470(5,15-39): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.ir.dxc.hlsl
index ec0bb6a..ddc0deb 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupBroadcast_34fa3d());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, subgroupBroadcast_34fa3d());
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.fxc.hlsl
index 9f667dd..4696146 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupBroadcast_3e6879() {
+  int2 arg_0 = (1).xx;
+  int2 res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupBroadcast_3e6879()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000012FD9152F00(5,14-38): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.ir.dxc.hlsl
index 6342df4..3698dcb 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupBroadcast_3e6879()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupBroadcast_3e6879()));
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.fxc.hlsl
index 9f667dd..8a1bc80 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 3> subgroupBroadcast_41e5d7() {
+  vector<float16_t, 3> arg_0 = (float16_t(1.0h)).xxx;
+  vector<float16_t, 3> res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcast_41e5d7());
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002009A3ED1D0(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.ir.dxc.hlsl
index 135d497..558481f 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcast_41e5d7());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcast_41e5d7());
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.fxc.hlsl
index 9f667dd..80658b6 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupBroadcast_4a4334() {
+  uint2 arg_0 = (1u).xx;
+  uint2 res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupBroadcast_4a4334()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000015D73FA0A90(5,15-39): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.ir.dxc.hlsl
index 93183b4..c6293dc 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupBroadcast_4a4334());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, subgroupBroadcast_4a4334());
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.fxc.hlsl
index 9f667dd..eb0b8b2 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float2 subgroupBroadcast_5196c8() {
+  float2 arg_0 = (1.0f).xx;
+  float2 res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupBroadcast_5196c8()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000028954BBF3F0(5,16-40): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.ir.dxc.hlsl
index 98f3022..51d56cc 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupBroadcast_5196c8()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupBroadcast_5196c8()));
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.fxc.hlsl
index 9f667dd..54b5589 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float3 subgroupBroadcast_912ff5() {
+  float3 arg_0 = (1.0f).xxx;
+  float3 res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupBroadcast_912ff5()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001EAC6861870(5,16-40): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.ir.dxc.hlsl
index 10dbeda..3bec826 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupBroadcast_912ff5()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupBroadcast_912ff5()));
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.fxc.hlsl
index 9f667dd..b4f143f 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float4 subgroupBroadcast_b7e93b() {
+  float4 arg_0 = (1.0f).xxxx;
+  float4 res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupBroadcast_b7e93b()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000011B9698C750(5,16-40): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.ir.dxc.hlsl
index 692042a..3250311 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupBroadcast_b7e93b()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupBroadcast_b7e93b()));
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.fxc.hlsl
index 9f667dd..9dcdf41 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupBroadcast_c36fe1() {
+  uint arg_0 = 1u;
+  uint res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupBroadcast_c36fe1()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001CF1DB58740(5,14-38): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.ir.dxc.hlsl
index c3dcbbc..e89162d 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupBroadcast_c36fe1());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, subgroupBroadcast_c36fe1());
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.fxc.hlsl
index 9f667dd..ea4ba8b 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupBroadcast_e275c8() {
+  int3 arg_0 = (1).xxx;
+  int3 res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupBroadcast_e275c8()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000002304F8DF590(5,14-38): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.ir.dxc.hlsl
index e5a54a3..7e1b164 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupBroadcast_e275c8()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupBroadcast_e275c8()));
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.fxc.hlsl
index 9f667dd..da1ba51 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.fxc.hlsl
@@ -1,9 +1,18 @@
 SKIP: FAILED
 
-/build/dawn/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc:2510 internal compiler error: TINT_UNREACHABLE unexpected subgroup builtin type subgroupBroadcast
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupBroadcast_f637f9() {
+  int4 arg_0 = (1).xxxx;
+  int4 res = WaveReadLaneAt(arg_0, 1u);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupBroadcast_f637f9()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000247A6AEF3F0(5,14-38): error X3004: undeclared identifier 'WaveReadLaneAt'
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.ir.dxc.hlsl
index 5336faa..9a3ca31 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupBroadcast_f637f9()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupBroadcast_f637f9()));
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
index 9d239f6..32929cc 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveAdd_01de08());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000021B04B460F0(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.dxc.hlsl
index fd6f146..9e985b3 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveAdd_01de08());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveAdd_01de08());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl
index 05f536f..93862b0 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_01de08();
+}
+
 kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_01de08();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl
index d081b72..ee7f6d0 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_0ff95a()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000023915FAC730(5,15-34): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.dxc.hlsl
index 015b41b..ae05244 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupExclusiveAdd_0ff95a());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, subgroupExclusiveAdd_0ff95a());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl
index 0b59b35..93b57bd 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_0ff95a();
+}
+
 kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_0ff95a();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl
index 90ffc25..e66eb0e 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_406ab4()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001DCC507C5C0(5,14-33): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.dxc.hlsl
index d21b0fd..66dc05b 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_406ab4()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_406ab4()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl
index 77a2827..e3821d9 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_406ab4();
+}
+
 kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_406ab4();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl
index 5fa9c28..04a5e91 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_41cfde()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000185503CC780(5,16-35): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.dxc.hlsl
index 10eb41c..019ad46 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_41cfde()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_41cfde()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl
index 46931b4..3da7919 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_41cfde();
+}
+
 kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_41cfde();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl
index 6a11ac5..c54fe37 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_42684c()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002530D1F3020(5,14-33): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.dxc.hlsl
index ddd18ab..1384ea9 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupExclusiveAdd_42684c());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, subgroupExclusiveAdd_42684c());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl
index 0cbeb50..e6b8097 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_42684c();
+}
+
 kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_42684c();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl
index 2e6431c..d070407 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_48acea()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001CB9AB514C0(5,15-34): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.dxc.hlsl
index 49f2626..3f8996e 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupExclusiveAdd_48acea());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, subgroupExclusiveAdd_48acea());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl
index 29d8438..10e78f2 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_48acea();
+}
+
 kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_48acea();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl
index 7e2c5bb..a3a5fc1 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<float16_t>(0u, subgroupExclusiveAdd_4a1568());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002893BF7CE00(3,1-9): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.dxc.hlsl
index 9900519..504aec6 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupExclusiveAdd_4a1568());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<float16_t>(0u, subgroupExclusiveAdd_4a1568());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl
index 85ce507..e4e1830 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4a1568();
+}
+
 kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4a1568();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl
index 1404144..9a25cef 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_4c8024()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001BD577EF2F0(5,16-35): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.dxc.hlsl
index f2df63a..4c27376 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_4c8024()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_4c8024()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl
index ffcc35f..019c36e 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4c8024();
+}
+
 kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4c8024();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl
index c6d5ea4..427b2b1 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_71ad0f()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000019D312F7D40(5,16-35): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.dxc.hlsl
index 3c6b4c5..c709842 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_71ad0f()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_71ad0f()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl
index b1ed3c5..16bce20 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_71ad0f();
+}
+
 kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_71ad0f();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl
index c67b9ab..b6dd6a2 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveAdd_95e984());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002C70D7B6B10(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.dxc.hlsl
index d7a10a4..7563612 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveAdd_95e984());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveAdd_95e984());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl
index 0bff85d..cc9d19f 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_95e984();
+}
+
 kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_95e984();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl
index b460c913..a1fc755 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_967e38()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002CD1519A860(5,15-34): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.dxc.hlsl
index ffea437..d3c2f9c 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_967e38()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_967e38()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl
index 8d70f30..65a2efa 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_967e38();
+}
+
 kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_967e38();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl
index d991977..0ca6f53 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_b0c261()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000015B056AC640(5,13-32): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.dxc.hlsl
index 4c46bfc..a4bab63 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_b0c261()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupExclusiveAdd_b0c261()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl
index 4915122..1ea569e 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_b0c261();
+}
+
 kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_b0c261();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl
index 8df1d15..d1c2ada 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_c08160()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001E796C6F3F0(5,14-33): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.dxc.hlsl
index 4c132cb..ddd83c4 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_c08160()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupExclusiveAdd_c08160()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl
index dea6388..226314b 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_c08160();
+}
+
 kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_c08160();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl
index 45d4452..b3653cc 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveAdd_e58e23());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000218B4A18C50(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.dxc.hlsl
index 3478d7a..2a274e5 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveAdd_e58e23());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveAdd_e58e23());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl
index 13dd3e9..5571fc2 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_e58e23();
+}
+
 kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_e58e23();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl
index 96b7118..0fb9ad4 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveAdd_ec300f()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002EF15578210(5,15-34): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.dxc.hlsl
index 45f30e0..b185a08 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupExclusiveAdd_ec300f());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupExclusiveAdd_ec300f());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl
index 01f2777..857c0b9 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_ec300f();
+}
+
 kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_ec300f();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl
index fd52edf..bad746d 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_f0f712()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001A5F2BA0120(5,14-33): error X3004: undeclared identifier 'WavePrefixSum'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.dxc.hlsl
index 913c7a3..5e752ec 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_f0f712()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupExclusiveAdd_f0f712()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl
index 2eeecda..d486110 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_f0f712();
+}
+
 kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_f0f712();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl
index e5c2e9e..302ce58 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_000b92()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001777B86C6C0(5,15-38): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.dxc.hlsl
index 714436b..dd2d775 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupExclusiveMul_000b92());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupExclusiveMul_000b92());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl
index 3c3fe00..c7cb885 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_000b92();
+}
+
 kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_000b92();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl
index 88fd682..e373375 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_019660()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001FE2E29D430(5,14-37): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.dxc.hlsl
index 214e7c3..54c9b01 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_019660()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_019660()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.msl
index 6230845..76c1311 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_019660();
+}
+
 kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_019660();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl
index 20808de..5ab948a 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_0a04d5()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000235DDB1D430(5,16-39): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.dxc.hlsl
index 3aeabb4..a3dbfbc 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_0a04d5()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_0a04d5()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl
index c98ef0f..ff0b97e 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_0a04d5();
+}
+
 kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_0a04d5();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl
index 102c02f..ce31df8 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveMul_13ba26());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002043BD7D1A0(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.dxc.hlsl
index 10d586b..c984526 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveMul_13ba26());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupExclusiveMul_13ba26());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl
index 78cb3c0..98320a3 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_13ba26();
+}
+
 kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_13ba26();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl
index efcdd64..366636d 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_25d1b9()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001E3784F6740(5,16-39): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.dxc.hlsl
index a21a009..da91405 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_25d1b9()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_25d1b9()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl
index 05ddc75..f7579ea 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_25d1b9();
+}
+
 kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_25d1b9();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl
index 9e7370d..25f0373 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_4525a3()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001AA39901970(5,14-37): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.dxc.hlsl
index 62994f9..dcadd35 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_4525a3()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_4525a3()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl
index 5fcc501..fa6d827 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_4525a3();
+}
+
 kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_4525a3();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl
index d0987cc..5ff4f26 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<float16_t>(0u, subgroupExclusiveMul_6f431e());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001C0F2921970(3,1-9): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.dxc.hlsl
index 93869c9..721df2f 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupExclusiveMul_6f431e());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<float16_t>(0u, subgroupExclusiveMul_6f431e());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl
index b592cca..cc1d7ed 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_6f431e();
+}
+
 kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_6f431e();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl
index b5ea6bb..f9b8be4 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_7b5f57()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001868919D5F0(5,16-39): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.dxc.hlsl
index 4d5ba9f..659bda5 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_7b5f57()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupExclusiveMul_7b5f57()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl
index a632666..14a0cd9 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_7b5f57();
+}
+
 kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_7b5f57();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl
index fc2491a..da1c1eb 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_87f23e()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000027E5CD61490(5,14-37): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.dxc.hlsl
index 49600de..6e79c7f 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_87f23e()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_87f23e()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl
index 8496c29..2f0bf23 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_87f23e();
+}
+
 kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_87f23e();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl
index 4d73d51..7e74ebe 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveMul_98b2e4()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000012F140BEFF0(5,15-38): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.dxc.hlsl
index 24860fb..908c962 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupExclusiveMul_98b2e4()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupExclusiveMul_98b2e4()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl
index 087c46b..6947e9d 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_98b2e4();
+}
+
 kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_98b2e4();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl
index bd78228..52980f5 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveMul_a07956());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001ABD42A6D10(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.dxc.hlsl
index 3324955..e04feb7 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveMul_a07956());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupExclusiveMul_a07956());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl
index 4e9fb2c..11be3a4 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a07956();
+}
+
 kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a07956();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl
index e5b5034..0916ebf 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveMul_a23002()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002022064D400(5,13-36): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.dxc.hlsl
index e612cc9..3dc6fda 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupExclusiveMul_a23002()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupExclusiveMul_a23002()));
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl
index 3fa153e..be27939 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a23002();
+}
+
 kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a23002();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl
index e2447d3..24eacaf 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupExclusiveMul_d1d490()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000117D6E9D1B0(5,15-38): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.dxc.hlsl
index 3b0ba73..8144d7e 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupExclusiveMul_d1d490());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, subgroupExclusiveMul_d1d490());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl
index b4ac97a..c5d6cb9 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_d1d490();
+}
+
 kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_d1d490();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl
index 17c12a0..bb78789 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupExclusiveMul_dc51f8()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001DD5D333B80(5,14-37): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.dxc.hlsl
index 58c760e..67bcc4f 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupExclusiveMul_dc51f8());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, subgroupExclusiveMul_dc51f8());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl
index 0135dc7..77f8a6e 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_dc51f8();
+}
+
 kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_dc51f8();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl
index 7e07267..e1d2cf1 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveMul_e88d1c());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000143BC5A8A30(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.dxc.hlsl
index 06d6545..39d1981 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveMul_e88d1c());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupExclusiveMul_e88d1c());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl
index cd8132d..467dbc7 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_e88d1c();
+}
+
 kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_e88d1c();
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl
index f11beb8..43392ab 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupExclusiveMul_f039f4()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000026D3A9EEFF0(5,15-38): error X3004: undeclared identifier 'WavePrefixProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.dxc.hlsl
index 04dea87..f2625d2 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupExclusiveMul_f039f4());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, subgroupExclusiveMul_f039f4());
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl
index 79899c0..3bf2f54 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_f039f4();
+}
+
 kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_f039f4();
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl
index 8cc60a8..b11ee0f 100644
--- a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupMul_0de9d3()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000190E3105D30(5,15-38): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.dxc.hlsl
index 6ce06cd..bfc8b5e 100644
--- a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupMul_0de9d3()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupMul_0de9d3()));
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.msl
index e227c90..aa86ec6 100644
--- a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_0de9d3();
+}
+
 kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_0de9d3();
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.fxc.hlsl
index 407c1be..490cf27 100644
--- a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<float16_t>(0u, subgroupMul_2941a2());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000011FF4B81950(3,1-9): error X3000: unrecognized identifier 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.dxc.hlsl
index 187601e..6a31d38 100644
--- a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<float16_t>(0u, subgroupMul_2941a2());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<float16_t>(0u, subgroupMul_2941a2());
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.msl
index 982234f..69b1513 100644
--- a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_2941a2();
+}
+
 kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_2941a2();
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.fxc.hlsl
index e3f222e..7392c5f 100644
--- a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupMul_3fe886()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000017E9396C570(5,13-36): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.dxc.hlsl
index 3ee77d8..5aa5900 100644
--- a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupMul_3fe886()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, asuint(subgroupMul_3fe886()));
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.msl
index 099a54d..5fdf86d 100644
--- a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_3fe886();
+}
+
 kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_3fe886();
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl
index 15d935d..be530fe 100644
--- a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store(0u, asuint(subgroupMul_4f8ee6()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000226A729C5D0(5,14-37): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.dxc.hlsl
index f693a49..55a187d 100644
--- a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupMul_4f8ee6());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store(0u, subgroupMul_4f8ee6());
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.msl
index 82a0d89..2545ad6 100644
--- a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_4f8ee6();
+}
+
 kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_4f8ee6();
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.fxc.hlsl
index 215e334..3790744 100644
--- a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupMul_53aee2());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002D5AAE986E0(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.dxc.hlsl
index 21cca2c..2426c9f 100644
--- a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupMul_53aee2());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupMul_53aee2());
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.msl
index 8ff7385..d2f128b 100644
--- a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_53aee2();
+}
+
 kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_53aee2();
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl
index 4ebc627..531a5d1 100644
--- a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupMul_5a8c86()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002DD34B2CA40(5,14-37): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.dxc.hlsl
index ad72ca2..20652ec 100644
--- a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupMul_5a8c86()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupMul_5a8c86()));
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.msl
index fcc76de..bcd01e3 100644
--- a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_5a8c86();
+}
+
 kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_5a8c86();
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.fxc.hlsl
index 3220c0d..158c9b6 100644
--- a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupMul_66c813()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000150F0556020(5,16-39): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.dxc.hlsl
index 2023c74..dd31e14 100644
--- a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupMul_66c813()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupMul_66c813()));
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.msl
index 9a889e7..d236d07 100644
--- a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_66c813();
+}
+
 kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_66c813();
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl
index 534753b..d05b354 100644
--- a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupMul_6aaaf3());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000017C08E7C980(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.dxc.hlsl
index 99bf1bd..a131e94 100644
--- a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupMul_6aaaf3());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupMul_6aaaf3());
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.msl
index 2a7ce99..3ddc56e 100644
--- a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_6aaaf3();
+}
+
 kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_6aaaf3();
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.fxc.hlsl
index cf5dbde..ea6f6fd 100644
--- a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupMul_93eccd()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000019046D0CA40(5,16-39): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.dxc.hlsl
index 537475c..730840b 100644
--- a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupMul_93eccd()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, asuint(subgroupMul_93eccd()));
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.msl
index e706376..6425b3b 100644
--- a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_93eccd();
+}
+
 kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_93eccd();
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.fxc.hlsl
index 0695820..5ccc3f3 100644
--- a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupMul_d584a2()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001A764FA2270(5,14-37): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.dxc.hlsl
index fe001de..5d39e33 100644
--- a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupMul_d584a2()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupMul_d584a2()));
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.msl
index 3352874..0e74a6c 100644
--- a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_d584a2();
+}
+
 kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_d584a2();
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.fxc.hlsl
index b10c495..801a013 100644
--- a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupMul_dc672a()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000012085D71720(5,15-38): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.dxc.hlsl
index b02d28a..69c3731 100644
--- a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupMul_dc672a());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, subgroupMul_dc672a());
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.msl
index 800252f..e483420 100644
--- a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_dc672a();
+}
+
 kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_dc672a();
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.fxc.hlsl
index bf2b5d1..59bcc91 100644
--- a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupMul_dd1333()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000001D174918BC0(5,15-38): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.dxc.hlsl
index 47dd237..37aee3d 100644
--- a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupMul_dd1333());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, subgroupMul_dd1333());
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.msl
index 9c06632..ed0d62a 100644
--- a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_dd1333();
+}
+
 kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_dd1333();
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl
index c9dddfc..31b4f19 100644
--- a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupMul_f2ac5b());
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x000002BF0EFF69B0(3,8-16): error X3000: syntax error: unexpected token 'float16_t'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.dxc.hlsl
index 98ff3bf..b6a78d0 100644
--- a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupMul_f2ac5b());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupMul_f2ac5b());
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.msl
index 0112b17..6264574 100644
--- a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_f2ac5b();
+}
+
 kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_f2ac5b();
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.fxc.hlsl
index d68b84a..23cf20a 100644
--- a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store2(0u, asuint(subgroupMul_f78398()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000018B58DD0AC0(5,16-39): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.dxc.hlsl
index a7a7644..4c71fcb 100644
--- a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupMul_f78398()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store2(0u, asuint(subgroupMul_f78398()));
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.msl
index 4e2b704..2241417 100644
--- a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_f78398();
+}
+
 kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_f78398();
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.fxc.hlsl
index 72c6737..b5b5c32 100644
--- a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store3(0u, asuint(subgroupMul_fa781b()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x00000194394D0A40(5,15-38): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.dxc.hlsl
index 8c86862..58f45f7 100644
--- a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupMul_fa781b());
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store3(0u, subgroupMul_fa781b());
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.msl
index a403e72..bc000ea 100644
--- a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_fa781b();
+}
+
 kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_fa781b();
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.fxc.hlsl
index 7efad3f..efeda15 100644
--- a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.fxc.hlsl
@@ -13,3 +13,6 @@
   prevent_dce.Store4(0u, asuint(subgroupMul_fab258()));
   return;
 }
+FXC validation failure:
+C:\src\dawn\Shader@0x0000026A1C714740(5,14-37): error X3004: undeclared identifier 'WaveActiveProduct'
+
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.dxc.hlsl
index 666ef92..b095d30 100644
--- a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.dxc.hlsl
@@ -6,6 +6,10 @@
   return res;
 }
 
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupMul_fab258()));
+}
+
 [numthreads(1, 1, 1)]
 void compute_main() {
   prevent_dce.Store4(0u, asuint(subgroupMul_fab258()));
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.msl
index a26d662..06bd2c5 100644
--- a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.msl
@@ -11,6 +11,11 @@
   return res;
 }
 
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_fab258();
+}
+
 kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
   tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
   (*tint_module_vars.prevent_dce) = subgroupMul_fab258();
diff --git a/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl
new file mode 100644
index 0000000..c760d87
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupOr(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupOr_03343f() -> vec3<i32>{
+  var arg_0 = vec3<i32>(1i);
+  var res: vec3<i32> = subgroupOr(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_03343f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_03343f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f273095
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupOr_03343f() {
+  int3 arg_0 = (1).xxx;
+  int3 res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_03343f()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_03343f()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..79c3767
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupOr_03343f() {
+  int3 arg_0 = (1).xxx;
+  int3 res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_03343f()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001F388990A60(5,20-49): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.glsl
new file mode 100644
index 0000000..92b995f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupOr_03343f() -> vec3<i32> {
+  var arg_0 = vec3<i32>(1i);
+  var res : vec3<i32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_03343f();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..b9ae642
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int3 subgroupOr_03343f() {
+  int3 arg_0 = (1).xxx;
+  int3 res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_03343f()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_03343f()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..6d56a95
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupOr_03343f() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_03343f();
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_03343f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9832065
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.ir.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_03343f "subgroupOr_03343f"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_03343f = 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 = OpGroupNonUniformBitwiseOr %v3int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v3int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3int %subgroupOr_03343f
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %28 = OpLabel
+         %29 = OpFunctionCall %v3int %subgroupOr_03343f
+         %30 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %30 %29
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.msl
new file mode 100644
index 0000000..bcc76a0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int3 subgroupOr_03343f() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupOr_03343f());
+  return;
+}
+
+kernel void compute_main(device packed_int3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_int3(subgroupOr_03343f());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.spvasm
new file mode 100644
index 0000000..fdcb4ee
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupOr_03343f() -> vec3<i32> {
+  var arg_0 = vec3<i32>(1i);
+  var res : vec3<i32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_03343f();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.wgsl
new file mode 100644
index 0000000..99e40d4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/03343f.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupOr_03343f() -> vec3<i32> {
+  var arg_0 = vec3<i32>(1i);
+  var res : vec3<i32> = subgroupOr(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_03343f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_03343f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl
new file mode 100644
index 0000000..50a62fa
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupOr(value: u32) -> u32
+fn subgroupOr_0bc264() -> u32{
+  var arg_0 = 1u;
+  var res: u32 = subgroupOr(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..08ece56
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupOr_0bc264() {
+  uint arg_0 = 1u;
+  uint res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_0bc264()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_0bc264()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..dd10697
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupOr_0bc264() {
+  uint arg_0 = 1u;
+  uint res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_0bc264()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000276B3B416D0(5,14-35): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.glsl
new file mode 100644
index 0000000..693e01c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupOr_0bc264() -> u32 {
+  var arg_0 = 1u;
+  var res : u32 = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..0d0586e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint subgroupOr_0bc264() {
+  uint arg_0 = 1u;
+  uint res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupOr_0bc264());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, subgroupOr_0bc264());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.ir.msl
new file mode 100644
index 0000000..0714491
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupOr_0bc264() {
+  uint arg_0 = 1u;
+  uint res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_0bc264();
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_0bc264();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..f02dbad
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.ir.spvasm
@@ -0,0 +1,60 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_0bc264 "subgroupOr_0bc264"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_0bc264 = 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 = OpGroupNonUniformBitwiseOr %uint %uint_3 Reduce %11
+               OpStore %res %12
+         %15 = OpLoad %uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %uint %subgroupOr_0bc264
+         %21 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %uint %subgroupOr_0bc264
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.msl
new file mode 100644
index 0000000..ee4551e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint subgroupOr_0bc264() {
+  uint arg_0 = 1u;
+  uint res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_0bc264();
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_0bc264();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.spvasm
new file mode 100644
index 0000000..d553036
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupOr_0bc264() -> u32 {
+  var arg_0 = 1u;
+  var res : u32 = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.wgsl
new file mode 100644
index 0000000..f4cc305
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/0bc264.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupOr_0bc264() -> u32 {
+  var arg_0 = 1u;
+  var res : u32 = subgroupOr(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_0bc264();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl
new file mode 100644
index 0000000..c9b6523
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupOr(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupOr_3f60e0() -> vec2<i32>{
+  var arg_0 = vec2<i32>(1i);
+  var res: vec2<i32> = subgroupOr(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..7354ab8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupOr_3f60e0() {
+  int2 arg_0 = (1).xx;
+  int2 res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_3f60e0()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_3f60e0()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c0f5732
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupOr_3f60e0() {
+  int2 arg_0 = (1).xx;
+  int2 res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_3f60e0()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000163904B6B50(5,20-49): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.glsl
new file mode 100644
index 0000000..6a71a0d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupOr_3f60e0() -> vec2<i32> {
+  var arg_0 = vec2<i32>(1i);
+  var res : vec2<i32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..47baab6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int2 subgroupOr_3f60e0() {
+  int2 arg_0 = (1).xx;
+  int2 res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_3f60e0()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_3f60e0()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.ir.msl
new file mode 100644
index 0000000..643c073
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupOr_3f60e0() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_3f60e0();
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_3f60e0();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..901d9d4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.ir.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_3f60e0 "subgroupOr_3f60e0"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_3f60e0 = 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 = OpGroupNonUniformBitwiseOr %v2int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v2int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2int %subgroupOr_3f60e0
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %28 = OpLabel
+         %29 = OpFunctionCall %v2int %subgroupOr_3f60e0
+         %30 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %30 %29
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.msl
new file mode 100644
index 0000000..c083fe5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int2 subgroupOr_3f60e0() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_3f60e0();
+  return;
+}
+
+kernel void compute_main(device int2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_3f60e0();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.spvasm
new file mode 100644
index 0000000..9d90c50
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupOr_3f60e0() -> vec2<i32> {
+  var arg_0 = vec2<i32>(1i);
+  var res : vec2<i32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.wgsl
new file mode 100644
index 0000000..716d7d9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/3f60e0.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupOr_3f60e0() -> vec2<i32> {
+  var arg_0 = vec2<i32>(1i);
+  var res : vec2<i32> = subgroupOr(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_3f60e0();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl
new file mode 100644
index 0000000..e6e76b7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupOr(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupOr_4d4eb0() -> vec4<i32>{
+  var arg_0 = vec4<i32>(1i);
+  var res: vec4<i32> = subgroupOr(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..63fe1ec
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupOr_4d4eb0() {
+  int4 arg_0 = (1).xxxx;
+  int4 res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_4d4eb0()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_4d4eb0()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6c7c446
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupOr_4d4eb0() {
+  int4 arg_0 = (1).xxxx;
+  int4 res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_4d4eb0()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000017424300340(5,20-49): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.glsl
new file mode 100644
index 0000000..ee02197
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupOr_4d4eb0() -> vec4<i32> {
+  var arg_0 = vec4<i32>(1i);
+  var res : vec4<i32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..f12199b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int4 subgroupOr_4d4eb0() {
+  int4 arg_0 = (1).xxxx;
+  int4 res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_4d4eb0()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_4d4eb0()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.ir.msl
new file mode 100644
index 0000000..8b01c02
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupOr_4d4eb0() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_4d4eb0();
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_4d4eb0();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6b3c024
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.ir.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_4d4eb0 "subgroupOr_4d4eb0"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_4d4eb0 = 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 = OpGroupNonUniformBitwiseOr %v4int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v4int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4int %subgroupOr_4d4eb0
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %28 = OpLabel
+         %29 = OpFunctionCall %v4int %subgroupOr_4d4eb0
+         %30 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %30 %29
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.msl
new file mode 100644
index 0000000..0e91ce4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int4 subgroupOr_4d4eb0() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_4d4eb0();
+  return;
+}
+
+kernel void compute_main(device int4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_4d4eb0();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.spvasm
new file mode 100644
index 0000000..e4fb383
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupOr_4d4eb0() -> vec4<i32> {
+  var arg_0 = vec4<i32>(1i);
+  var res : vec4<i32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.wgsl
new file mode 100644
index 0000000..01f8d44
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/4d4eb0.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupOr_4d4eb0() -> vec4<i32> {
+  var arg_0 = vec4<i32>(1i);
+  var res : vec4<i32> = subgroupOr(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_4d4eb0();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl
new file mode 100644
index 0000000..44e3917
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupOr(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupOr_663a21() -> vec3<u32>{
+  var arg_0 = vec3<u32>(1u);
+  var res: vec3<u32> = subgroupOr(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_663a21();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_663a21();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..00f6a58
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupOr_663a21() {
+  uint3 arg_0 = (1u).xxx;
+  uint3 res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_663a21()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_663a21()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..53d269f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupOr_663a21() {
+  uint3 arg_0 = (1u).xxx;
+  uint3 res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupOr_663a21()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000021C1887D010(5,15-36): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.glsl
new file mode 100644
index 0000000..2f6adfa
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupOr_663a21() -> vec3<u32> {
+  var arg_0 = vec3<u32>(1u);
+  var res : vec3<u32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_663a21();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..5be83bc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint3 subgroupOr_663a21() {
+  uint3 arg_0 = (1u).xxx;
+  uint3 res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupOr_663a21());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, subgroupOr_663a21());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.ir.msl
new file mode 100644
index 0000000..fd80e54
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupOr_663a21() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_663a21();
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_663a21();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..0aadd79
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_663a21 "subgroupOr_663a21"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_663a21 = 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 = OpGroupNonUniformBitwiseOr %v3uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v3uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v3uint %subgroupOr_663a21
+         %23 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %27 = OpLabel
+         %28 = OpFunctionCall %v3uint %subgroupOr_663a21
+         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %29 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.msl
new file mode 100644
index 0000000..3533e18
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint3 subgroupOr_663a21() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupOr_663a21());
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_uint3(subgroupOr_663a21());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.spvasm
new file mode 100644
index 0000000..7c50bc4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupOr_663a21() -> vec3<u32> {
+  var arg_0 = vec3<u32>(1u);
+  var res : vec3<u32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_663a21();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.wgsl
new file mode 100644
index 0000000..e09acbc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/663a21.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupOr_663a21() -> vec3<u32> {
+  var arg_0 = vec3<u32>(1u);
+  var res : vec3<u32> = subgroupOr(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_663a21();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_663a21();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl
new file mode 100644
index 0000000..661374d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupOr(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupOr_aa74f7() -> vec2<u32>{
+  var arg_0 = vec2<u32>(1u);
+  var res: vec2<u32> = subgroupOr(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f820576
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupOr_aa74f7() {
+  uint2 arg_0 = (1u).xx;
+  uint2 res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_aa74f7()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_aa74f7()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..dbe2566
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupOr_aa74f7() {
+  uint2 arg_0 = (1u).xx;
+  uint2 res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupOr_aa74f7()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000245F48D0340(5,15-36): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.glsl
new file mode 100644
index 0000000..2adea12
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupOr_aa74f7() -> vec2<u32> {
+  var arg_0 = vec2<u32>(1u);
+  var res : vec2<u32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..b8b4f87
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint2 subgroupOr_aa74f7() {
+  uint2 arg_0 = (1u).xx;
+  uint2 res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupOr_aa74f7());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, subgroupOr_aa74f7());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.ir.msl
new file mode 100644
index 0000000..4999c82
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupOr_aa74f7() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_aa74f7();
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_aa74f7();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6c3d0fb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_aa74f7 "subgroupOr_aa74f7"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_aa74f7 = 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 = OpGroupNonUniformBitwiseOr %v2uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v2uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v2uint %subgroupOr_aa74f7
+         %23 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %27 = OpLabel
+         %28 = OpFunctionCall %v2uint %subgroupOr_aa74f7
+         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %29 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.msl
new file mode 100644
index 0000000..9597b5e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint2 subgroupOr_aa74f7() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_aa74f7();
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_aa74f7();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.spvasm
new file mode 100644
index 0000000..e5b3376
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupOr_aa74f7() -> vec2<u32> {
+  var arg_0 = vec2<u32>(1u);
+  var res : vec2<u32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.wgsl
new file mode 100644
index 0000000..45d687f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/aa74f7.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupOr_aa74f7() -> vec2<u32> {
+  var arg_0 = vec2<u32>(1u);
+  var res : vec2<u32> = subgroupOr(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_aa74f7();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl
new file mode 100644
index 0000000..01a52c1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupOr(value: i32) -> i32
+fn subgroupOr_ae58b6() -> i32{
+  var arg_0 = 1i;
+  var res: i32 = subgroupOr(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b293b08
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupOr_ae58b6() {
+  int arg_0 = 1;
+  int res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_ae58b6()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_ae58b6()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8e9b1f5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupOr_ae58b6() {
+  int arg_0 = 1;
+  int res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_ae58b6()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000198A2958DD0(5,19-48): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.glsl
new file mode 100644
index 0000000..a15cc7e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupOr_ae58b6() -> i32 {
+  var arg_0 = 1i;
+  var res : i32 = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..6a7f9f1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int subgroupOr_ae58b6() {
+  int arg_0 = 1;
+  int res = asint(WaveActiveBitOr(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_ae58b6()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupOr_ae58b6()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.ir.msl
new file mode 100644
index 0000000..cfcce77
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupOr_ae58b6() {
+  int arg_0 = 1;
+  int res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_ae58b6();
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_ae58b6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2f5d025
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.ir.spvasm
@@ -0,0 +1,61 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_ae58b6 "subgroupOr_ae58b6"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_ae58b6 = 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 = OpGroupNonUniformBitwiseOr %int %uint_3 Reduce %11
+               OpStore %res %12
+         %16 = OpLoad %int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %int %subgroupOr_ae58b6
+         %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %int %subgroupOr_ae58b6
+         %28 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.msl
new file mode 100644
index 0000000..724fc1c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int subgroupOr_ae58b6() {
+  int arg_0 = 1;
+  int res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_ae58b6();
+  return;
+}
+
+kernel void compute_main(device int* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_ae58b6();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.spvasm
new file mode 100644
index 0000000..e617363
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupOr_ae58b6() -> i32 {
+  var arg_0 = 1i;
+  var res : i32 = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.wgsl
new file mode 100644
index 0000000..d309090
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/ae58b6.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupOr_ae58b6() -> i32 {
+  var arg_0 = 1i;
+  var res : i32 = subgroupOr(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_ae58b6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl
new file mode 100644
index 0000000..1121834
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupOr(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupOr_f915e3() -> vec4<u32>{
+  var arg_0 = vec4<u32>(1u);
+  var res: vec4<u32> = subgroupOr(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..686862c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupOr_f915e3() {
+  uint4 arg_0 = (1u).xxxx;
+  uint4 res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_f915e3()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_f915e3()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..48b081a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupOr_f915e3() {
+  uint4 arg_0 = (1u).xxxx;
+  uint4 res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupOr_f915e3()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001CF09C586C0(5,15-36): error X3004: undeclared identifier 'WaveActiveBitOr'
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.glsl
new file mode 100644
index 0000000..487085b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupOr_f915e3() -> vec4<u32> {
+  var arg_0 = vec4<u32>(1u);
+  var res : vec4<u32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..2751523
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint4 subgroupOr_f915e3() {
+  uint4 arg_0 = (1u).xxxx;
+  uint4 res = WaveActiveBitOr(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupOr_f915e3());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, subgroupOr_f915e3());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..bf88926
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupOr_f915e3() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_f915e3();
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupOr_f915e3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b647bc6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupOr_f915e3 "subgroupOr_f915e3"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupOr_f915e3 = 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 = OpGroupNonUniformBitwiseOr %v4uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v4uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v4uint %subgroupOr_f915e3
+         %23 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %27 = OpLabel
+         %28 = OpFunctionCall %v4uint %subgroupOr_f915e3
+         %29 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %29 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.msl
new file mode 100644
index 0000000..12bc656
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint4 subgroupOr_f915e3() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_or(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupOr_f915e3();
+  return;
+}
+
+kernel void compute_main(device uint4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupOr_f915e3();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.spvasm
new file mode 100644
index 0000000..c32e7e1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupOr_f915e3() -> vec4<u32> {
+  var arg_0 = vec4<u32>(1u);
+  var res : vec4<u32> = subgroupOr(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.wgsl
new file mode 100644
index 0000000..c44d986
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupOr/f915e3.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupOr_f915e3() -> vec4<u32> {
+  var arg_0 = vec4<u32>(1u);
+  var res : vec4<u32> = subgroupOr(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupOr_f915e3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/468721.wgsl b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl
new file mode 100644
index 0000000..919a504
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupXor(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupXor_468721() -> vec3<u32>{
+  var arg_0 = vec3<u32>(1u);
+  var res: vec3<u32> = subgroupXor(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_468721();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_468721();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cfc0d8a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupXor_468721() {
+  uint3 arg_0 = (1u).xxx;
+  uint3 res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_468721()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_468721()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..99d7e76
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupXor_468721() {
+  uint3 arg_0 = (1u).xxx;
+  uint3 res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_468721()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000025503FCA700(5,15-37): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.glsl
new file mode 100644
index 0000000..4d7ce74
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupXor_468721() -> vec3<u32> {
+  var arg_0 = vec3<u32>(1u);
+  var res : vec3<u32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_468721();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupXor/468721.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..a8fd35a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint3 subgroupXor_468721() {
+  uint3 arg_0 = (1u).xxx;
+  uint3 res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, subgroupXor_468721());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, subgroupXor_468721());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.ir.msl
new file mode 100644
index 0000000..90a5745
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupXor_468721() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_468721();
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_468721();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..41306ca
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_468721 "subgroupXor_468721"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_468721 = 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 = OpGroupNonUniformBitwiseXor %v3uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v3uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v3uint %subgroupXor_468721
+         %23 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %27 = OpLabel
+         %28 = OpFunctionCall %v3uint %subgroupXor_468721
+         %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %29 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.msl
new file mode 100644
index 0000000..0941cf0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint3 subgroupXor_468721() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupXor_468721());
+  return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_uint3(subgroupXor_468721());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.spvasm
new file mode 100644
index 0000000..80c6ed8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupXor_468721() -> vec3<u32> {
+  var arg_0 = vec3<u32>(1u);
+  var res : vec3<u32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_468721();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.wgsl
new file mode 100644
index 0000000..91e97f7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/468721.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupXor_468721() -> vec3<u32> {
+  var arg_0 = vec3<u32>(1u);
+  var res : vec3<u32> = subgroupXor(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_468721();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_468721();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl
new file mode 100644
index 0000000..f0b3ff0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupXor(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupXor_473de8() -> vec2<i32>{
+  var arg_0 = vec2<i32>(1i);
+  var res: vec2<i32> = subgroupXor(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_473de8();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_473de8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..72c636a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupXor_473de8() {
+  int2 arg_0 = (1).xx;
+  int2 res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_473de8()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_473de8()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..a708681
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupXor_473de8() {
+  int2 arg_0 = (1).xx;
+  int2 res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_473de8()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000023FB7462020(5,20-50): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.glsl
new file mode 100644
index 0000000..3e5c6ed
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupXor_473de8() -> vec2<i32> {
+  var arg_0 = vec2<i32>(1i);
+  var res : vec2<i32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_473de8();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..772cdd6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int2 subgroupXor_473de8() {
+  int2 arg_0 = (1).xx;
+  int2 res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_473de8()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_473de8()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.ir.msl
new file mode 100644
index 0000000..1491e69
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupXor_473de8() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_473de8();
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_473de8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..c773599
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.ir.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_473de8 "subgroupXor_473de8"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_473de8 = 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 = OpGroupNonUniformBitwiseXor %v2int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v2int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2int %subgroupXor_473de8
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %28 = OpLabel
+         %29 = OpFunctionCall %v2int %subgroupXor_473de8
+         %30 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %30 %29
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.msl
new file mode 100644
index 0000000..5c838df
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int2 subgroupXor_473de8() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_473de8();
+  return;
+}
+
+kernel void compute_main(device int2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_473de8();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.spvasm
new file mode 100644
index 0000000..ae720a9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupXor_473de8() -> vec2<i32> {
+  var arg_0 = vec2<i32>(1i);
+  var res : vec2<i32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_473de8();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.wgsl
new file mode 100644
index 0000000..da7bdfe
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/473de8.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupXor_473de8() -> vec2<i32> {
+  var arg_0 = vec2<i32>(1i);
+  var res : vec2<i32> = subgroupXor(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_473de8();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_473de8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl
new file mode 100644
index 0000000..c95471e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupXor(value: i32) -> i32
+fn subgroupXor_694b17() -> i32{
+  var arg_0 = 1i;
+  var res: i32 = subgroupXor(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_694b17();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_694b17();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4e79139
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupXor_694b17() {
+  int arg_0 = 1;
+  int res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_694b17()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_694b17()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..10da165
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupXor_694b17() {
+  int arg_0 = 1;
+  int res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_694b17()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000202AF560C30(5,19-49): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.glsl
new file mode 100644
index 0000000..5d1612d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupXor_694b17() -> i32 {
+  var arg_0 = 1i;
+  var res : i32 = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_694b17();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..7593d1c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int subgroupXor_694b17() {
+  int arg_0 = 1;
+  int res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_694b17()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_694b17()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.ir.msl
new file mode 100644
index 0000000..364ec45
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupXor_694b17() {
+  int arg_0 = 1;
+  int res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_694b17();
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_694b17();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..a037259
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.ir.spvasm
@@ -0,0 +1,61 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_694b17 "subgroupXor_694b17"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_694b17 = 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 = OpGroupNonUniformBitwiseXor %int %uint_3 Reduce %11
+               OpStore %res %12
+         %16 = OpLoad %int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %int %subgroupXor_694b17
+         %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %26 = OpLabel
+         %27 = OpFunctionCall %int %subgroupXor_694b17
+         %28 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.msl
new file mode 100644
index 0000000..4fb9882
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int subgroupXor_694b17() {
+  int arg_0 = 1;
+  int res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_694b17();
+  return;
+}
+
+kernel void compute_main(device int* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_694b17();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.spvasm
new file mode 100644
index 0000000..aae2fa8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupXor_694b17() -> i32 {
+  var arg_0 = 1i;
+  var res : i32 = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_694b17();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.wgsl
new file mode 100644
index 0000000..5fa20ea
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/694b17.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupXor_694b17() -> i32 {
+  var arg_0 = 1i;
+  var res : i32 = subgroupXor(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_694b17();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_694b17();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl
new file mode 100644
index 0000000..7ae3552
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupXor(value: u32) -> u32
+fn subgroupXor_7750d6() -> u32{
+  var arg_0 = 1u;
+  var res: u32 = subgroupXor(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..7db2aab
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupXor_7750d6() {
+  uint arg_0 = 1u;
+  uint res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_7750d6()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_7750d6()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..58de8d5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupXor_7750d6() {
+  uint arg_0 = 1u;
+  uint res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, asuint(subgroupXor_7750d6()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000020C9D4871C0(5,14-36): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.glsl
new file mode 100644
index 0000000..78b2067
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupXor_7750d6() -> u32 {
+  var arg_0 = 1u;
+  var res : u32 = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..835b645
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint subgroupXor_7750d6() {
+  uint arg_0 = 1u;
+  uint res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store(0u, subgroupXor_7750d6());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store(0u, subgroupXor_7750d6());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.ir.msl
new file mode 100644
index 0000000..3fb3350
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupXor_7750d6() {
+  uint arg_0 = 1u;
+  uint res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_7750d6();
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_7750d6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..3709e04
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.ir.spvasm
@@ -0,0 +1,60 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 28
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_7750d6 "subgroupXor_7750d6"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_7750d6 = 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 = OpGroupNonUniformBitwiseXor %uint %uint_3 Reduce %11
+               OpStore %res %12
+         %15 = OpLoad %uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %uint %subgroupXor_7750d6
+         %21 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %25 = OpLabel
+         %26 = OpFunctionCall %uint %subgroupXor_7750d6
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.msl
new file mode 100644
index 0000000..9856538
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint subgroupXor_7750d6() {
+  uint arg_0 = 1u;
+  uint res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_7750d6();
+  return;
+}
+
+kernel void compute_main(device uint* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_7750d6();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.spvasm
new file mode 100644
index 0000000..39ebdb5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupXor_7750d6() -> u32 {
+  var arg_0 = 1u;
+  var res : u32 = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.wgsl
new file mode 100644
index 0000000..b4cc93c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7750d6.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupXor_7750d6() -> u32 {
+  var arg_0 = 1u;
+  var res : u32 = subgroupXor(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7750d6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl
new file mode 100644
index 0000000..6ca850b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupXor(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupXor_7f6672() -> vec2<u32>{
+  var arg_0 = vec2<u32>(1u);
+  var res: vec2<u32> = subgroupXor(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..fba1063
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupXor_7f6672() {
+  uint2 arg_0 = (1u).xx;
+  uint2 res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_7f6672()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_7f6672()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..1127739
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupXor_7f6672() {
+  uint2 arg_0 = (1u).xx;
+  uint2 res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, asuint(subgroupXor_7f6672()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x000001CCB8D07A70(5,15-37): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.glsl
new file mode 100644
index 0000000..351dc78
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupXor_7f6672() -> vec2<u32> {
+  var arg_0 = vec2<u32>(1u);
+  var res : vec2<u32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..7dabb57
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint2 subgroupXor_7f6672() {
+  uint2 arg_0 = (1u).xx;
+  uint2 res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store2(0u, subgroupXor_7f6672());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store2(0u, subgroupXor_7f6672());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.ir.msl
new file mode 100644
index 0000000..c403f37
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupXor_7f6672() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_7f6672();
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_7f6672();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..e082867
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_7f6672 "subgroupXor_7f6672"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_7f6672 = 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 = OpGroupNonUniformBitwiseXor %v2uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v2uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v2uint %subgroupXor_7f6672
+         %23 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %27 = OpLabel
+         %28 = OpFunctionCall %v2uint %subgroupXor_7f6672
+         %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %29 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.msl
new file mode 100644
index 0000000..48b7ae1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint2 subgroupXor_7f6672() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_7f6672();
+  return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_7f6672();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.spvasm
new file mode 100644
index 0000000..80c715f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupXor_7f6672() -> vec2<u32> {
+  var arg_0 = vec2<u32>(1u);
+  var res : vec2<u32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.wgsl
new file mode 100644
index 0000000..64a526b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/7f6672.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupXor_7f6672() -> vec2<u32> {
+  var arg_0 = vec2<u32>(1u);
+  var res : vec2<u32> = subgroupXor(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_7f6672();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl
new file mode 100644
index 0000000..d2b68ff
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupXor(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupXor_83b1f3() -> vec4<i32>{
+  var arg_0 = vec4<i32>(1i);
+  var res: vec4<i32> = subgroupXor(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8af14bd
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupXor_83b1f3() {
+  int4 arg_0 = (1).xxxx;
+  int4 res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_83b1f3()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_83b1f3()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c995385
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupXor_83b1f3() {
+  int4 arg_0 = (1).xxxx;
+  int4 res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_83b1f3()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000025DA8D81EB0(5,20-50): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.glsl
new file mode 100644
index 0000000..b15c3fb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupXor_83b1f3() -> vec4<i32> {
+  var arg_0 = vec4<i32>(1i);
+  var res : vec4<i32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..be8bfdb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int4 subgroupXor_83b1f3() {
+  int4 arg_0 = (1).xxxx;
+  int4 res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_83b1f3()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_83b1f3()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..5c8bbfa
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupXor_83b1f3() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_83b1f3();
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_83b1f3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..81a5ba3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.ir.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_83b1f3 "subgroupXor_83b1f3"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_83b1f3 = 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 = OpGroupNonUniformBitwiseXor %v4int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v4int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4int %subgroupXor_83b1f3
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %28 = OpLabel
+         %29 = OpFunctionCall %v4int %subgroupXor_83b1f3
+         %30 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %30 %29
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.msl
new file mode 100644
index 0000000..3093099
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int4 subgroupXor_83b1f3() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_83b1f3();
+  return;
+}
+
+kernel void compute_main(device int4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_83b1f3();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.spvasm
new file mode 100644
index 0000000..7e24b97
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupXor_83b1f3() -> vec4<i32> {
+  var arg_0 = vec4<i32>(1i);
+  var res : vec4<i32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.wgsl
new file mode 100644
index 0000000..c46e996
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/83b1f3.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupXor_83b1f3() -> vec4<i32> {
+  var arg_0 = vec4<i32>(1i);
+  var res : vec4<i32> = subgroupXor(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_83b1f3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl
new file mode 100644
index 0000000..3564060
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupXor(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupXor_9c6e73() -> vec3<i32>{
+  var arg_0 = vec3<i32>(1i);
+  var res: vec3<i32> = subgroupXor(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9c20be8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupXor_9c6e73() {
+  int3 arg_0 = (1).xxx;
+  int3 res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_9c6e73()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_9c6e73()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..b339ce8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupXor_9c6e73() {
+  int3 arg_0 = (1).xxx;
+  int3 res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_9c6e73()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x0000026409513030(5,20-50): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.glsl
new file mode 100644
index 0000000..ce58f47
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupXor_9c6e73() -> vec3<i32> {
+  var arg_0 = vec3<i32>(1i);
+  var res : vec3<i32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..126616e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int3 subgroupXor_9c6e73() {
+  int3 arg_0 = (1).xxx;
+  int3 res = asint(WaveActiveBitXor(asuint(arg_0)));
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_9c6e73()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store3(0u, asuint(subgroupXor_9c6e73()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.ir.msl
new file mode 100644
index 0000000..5e84240
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupXor_9c6e73() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_9c6e73();
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_9c6e73();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..4b384c8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.ir.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_9c6e73 "subgroupXor_9c6e73"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_9c6e73 = 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 = OpGroupNonUniformBitwiseXor %v3int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v3int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3int %subgroupXor_9c6e73
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %28 = OpLabel
+         %29 = OpFunctionCall %v3int %subgroupXor_9c6e73
+         %30 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %30 %29
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.msl
new file mode 100644
index 0000000..e3f0dad
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int3 subgroupXor_9c6e73() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupXor_9c6e73());
+  return;
+}
+
+kernel void compute_main(device packed_int3* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = packed_int3(subgroupXor_9c6e73());
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.spvasm
new file mode 100644
index 0000000..322a863
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupXor_9c6e73() -> vec3<i32> {
+  var arg_0 = vec3<i32>(1i);
+  var res : vec3<i32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.wgsl
new file mode 100644
index 0000000..8c7b36d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9c6e73.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupXor_9c6e73() -> vec3<i32> {
+  var arg_0 = vec3<i32>(1i);
+  var res : vec3<i32> = subgroupXor(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9c6e73();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl
new file mode 100644
index 0000000..fb4e4af
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl
@@ -0,0 +1,59 @@
+// 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
+////////////////////////////////////////////////////////////////////////////////
+
+
+// [hlsl-dxc] flags: --hlsl_shader_model 60
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupXor(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupXor_9d77e4() -> vec4<u32>{
+  var arg_0 = vec4<u32>(1u);
+  var res: vec4<u32> = subgroupXor(arg_0);
+  return res;
+}
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..98d36e2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupXor_9d77e4() {
+  uint4 arg_0 = (1u).xxxx;
+  uint4 res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_9d77e4()));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_9d77e4()));
+  return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..35ab082
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupXor_9d77e4() {
+  uint4 arg_0 = (1u).xxxx;
+  uint4 res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, asuint(subgroupXor_9d77e4()));
+  return;
+}
+FXC validation failure:
+C:\src\dawn\Shader@0x00000218D8F23750(5,15-37): error X3004: undeclared identifier 'WaveActiveBitXor'
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.glsl
new file mode 100644
index 0000000..7011066
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupXor_9d77e4() -> vec4<u32> {
+  var arg_0 = vec4<u32>(1u);
+  var res : vec4<u32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+       ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..ed57471
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint4 subgroupXor_9d77e4() {
+  uint4 arg_0 = (1u).xxxx;
+  uint4 res = WaveActiveBitXor(arg_0);
+  return res;
+}
+
+void fragment_main() {
+  prevent_dce.Store4(0u, subgroupXor_9d77e4());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  prevent_dce.Store4(0u, subgroupXor_9d77e4());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.ir.msl
new file mode 100644
index 0000000..1a0c716
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupXor_9d77e4() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_9d77e4();
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupXor_9d77e4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..0f221e7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupXor_9d77e4 "subgroupXor_9d77e4"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %fragment_main "fragment_main"
+               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
+%subgroupXor_9d77e4 = 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 = OpGroupNonUniformBitwiseXor %v4uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v4uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v4uint %subgroupXor_9d77e4
+         %23 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %27 = OpLabel
+         %28 = OpFunctionCall %v4uint %subgroupXor_9d77e4
+         %29 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %29 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.msl
new file mode 100644
index 0000000..67591a7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint4 subgroupXor_9d77e4() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_xor(arg_0);
+  return res;
+}
+
+fragment void fragment_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupXor_9d77e4();
+  return;
+}
+
+kernel void compute_main(device uint4* tint_symbol_1 [[buffer(0)]]) {
+  *(tint_symbol_1) = subgroupXor_9d77e4();
+  return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.spvasm
new file mode 100644
index 0000000..dbeb049
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupXor_9d77e4() -> vec4<u32> {
+  var arg_0 = vec4<u32>(1u);
+  var res : vec4<u32> = subgroupXor(arg_0);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.wgsl
new file mode 100644
index 0000000..b4bc607
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupXor/9d77e4.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupXor_9d77e4() -> vec4<u32> {
+  var arg_0 = vec4<u32>(1u);
+  var res : vec4<u32> = subgroupXor(arg_0);
+  return res;
+}
+
+@fragment
+fn fragment_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupXor_9d77e4();
+}