[tint] Implement subgroupElect and BroadcastFirst
Implement subgroupElect and subgroupBroadcastFirst builtins for WGSL,
SPIR-V IR backend (not AST), MSL AST and IR backends and HLSL AST and IR backends. Subgroup builtins are not yet implemented for the GLSL
backend.
Also implement subgroupBroadcast for the MSL IR backend where was not
yet supported.
Bug: 354738715
Change-Id: I3ff29b06d7bd2ff492a07b30bbff48aef0a669e2
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/201917
Commit-Queue: Natalie Chouinard <chouinard@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/tint/cmd/fuzz/wgsl/dictionary.txt b/src/tint/cmd/fuzz/wgsl/dictionary.txt
index 222fa52..102c6ca 100644
--- a/src/tint/cmd/fuzz/wgsl/dictionary.txt
+++ b/src/tint/cmd/fuzz/wgsl/dictionary.txt
@@ -373,6 +373,8 @@
"subgroupAny"
"subgroupBallot"
"subgroupBroadcast"
+"subgroupBroadcastFirst"
+"subgroupElect"
"subgroupExclusiveAdd"
"subgroupExclusiveMul"
"subgroupMax"
diff --git a/src/tint/lang/core/builtin_fn.cc b/src/tint/lang/core/builtin_fn.cc
index ad8a8a8..84ed488 100644
--- a/src/tint/lang/core/builtin_fn.cc
+++ b/src/tint/lang/core/builtin_fn.cc
@@ -402,9 +402,15 @@
if (name == "subgroupBallot") {
return BuiltinFn::kSubgroupBallot;
}
+ if (name == "subgroupElect") {
+ return BuiltinFn::kSubgroupElect;
+ }
if (name == "subgroupBroadcast") {
return BuiltinFn::kSubgroupBroadcast;
}
+ if (name == "subgroupBroadcastFirst") {
+ return BuiltinFn::kSubgroupBroadcastFirst;
+ }
if (name == "subgroupAdd") {
return BuiltinFn::kSubgroupAdd;
}
@@ -687,8 +693,12 @@
return "atomicCompareExchangeWeak";
case BuiltinFn::kSubgroupBallot:
return "subgroupBallot";
+ case BuiltinFn::kSubgroupElect:
+ return "subgroupElect";
case BuiltinFn::kSubgroupBroadcast:
return "subgroupBroadcast";
+ case BuiltinFn::kSubgroupBroadcastFirst:
+ return "subgroupBroadcastFirst";
case BuiltinFn::kSubgroupAdd:
return "subgroupAdd";
case BuiltinFn::kSubgroupExclusiveAdd:
diff --git a/src/tint/lang/core/builtin_fn.h b/src/tint/lang/core/builtin_fn.h
index 508c3dc..fab5d65 100644
--- a/src/tint/lang/core/builtin_fn.h
+++ b/src/tint/lang/core/builtin_fn.h
@@ -168,7 +168,9 @@
kAtomicExchange,
kAtomicCompareExchangeWeak,
kSubgroupBallot,
+ kSubgroupElect,
kSubgroupBroadcast,
+ kSubgroupBroadcastFirst,
kSubgroupAdd,
kSubgroupExclusiveAdd,
kSubgroupMul,
@@ -323,7 +325,9 @@
BuiltinFn::kAtomicExchange,
BuiltinFn::kAtomicCompareExchangeWeak,
BuiltinFn::kSubgroupBallot,
+ BuiltinFn::kSubgroupElect,
BuiltinFn::kSubgroupBroadcast,
+ BuiltinFn::kSubgroupBroadcastFirst,
BuiltinFn::kSubgroupAdd,
BuiltinFn::kSubgroupExclusiveAdd,
BuiltinFn::kSubgroupMul,
@@ -460,7 +464,9 @@
"atomicExchange",
"atomicCompareExchangeWeak",
"subgroupBallot",
+ "subgroupElect",
"subgroupBroadcast",
+ "subgroupBroadcastFirst",
"subgroupAdd",
"subgroupExclusiveAdd",
"subgroupMul",
diff --git a/src/tint/lang/core/core.def b/src/tint/lang/core/core.def
index d1e1fb4..35cae5e 100644
--- a/src/tint/lang/core/core.def
+++ b/src/tint/lang/core/core.def
@@ -700,8 +700,11 @@
@stage("fragment", "compute") fn atomicCompareExchangeWeak[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T, T) -> __atomic_compare_exchange_result<T>
@must_use @stage("fragment", "compute") fn subgroupBallot(bool) -> vec4<u32>
+@must_use @stage("fragment", "compute") fn subgroupElect() -> bool
@must_use @stage("fragment", "compute") fn subgroupBroadcast[T: fiu32_f16](value: T, @const sourceLaneIndex: u32) -> T
@must_use @stage("fragment", "compute") fn subgroupBroadcast[N: num, T: fiu32_f16](value: vec<N, T>, @const sourceLaneIndex: u32) -> vec<N, T>
+@must_use @stage("fragment", "compute") fn subgroupBroadcastFirst[T: fiu32_f16](value: T) -> T
+@must_use @stage("fragment", "compute") fn subgroupBroadcastFirst[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
@must_use @stage("fragment", "compute") fn subgroupAdd[T: fiu32_f16](value: T) -> T
@must_use @stage("fragment", "compute") fn subgroupAdd[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
@must_use @stage("fragment", "compute") fn subgroupExclusiveAdd[T: fiu32_f16](value: T) -> T
diff --git a/src/tint/lang/core/intrinsic/data.cc b/src/tint/lang/core/intrinsic/data.cc
index a23c8a5..3847a30 100644
--- a/src/tint/lang/core/intrinsic/data.cc
+++ b/src/tint/lang/core/intrinsic/data.cc
@@ -9548,6 +9548,17 @@
{
/* [469] */
/* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+ /* num_parameters */ 0,
+ /* num_explicit_templates */ 0,
+ /* num_templates */ 0,
+ /* templates */ TemplateIndex(/* invalid */),
+ /* parameters */ ParameterIndex(/* invalid */),
+ /* return_matcher_indices */ MatcherIndicesIndex(43),
+ /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+ },
+ {
+ /* [470] */
+ /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
/* num_parameters */ 1,
/* num_explicit_templates */ 0,
/* num_templates */ 0,
@@ -9557,7 +9568,7 @@
/* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
},
{
- /* [470] */
+ /* [471] */
/* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
/* num_parameters */ 2,
/* num_explicit_templates */ 0,
@@ -9568,7 +9579,7 @@
/* const_eval_fn */ ConstEvalFunctionIndex(95),
},
{
- /* [471] */
+ /* [472] */
/* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
/* num_parameters */ 2,
/* num_explicit_templates */ 0,
@@ -10516,85 +10527,98 @@
},
{
/* [121] */
+ /* fn subgroupElect() -> bool */
+ /* num overloads */ 1,
+ /* overloads */ OverloadIndex(469),
+ },
+ {
+ /* [122] */
/* fn subgroupBroadcast[T : fiu32_f16](value: T, @const sourceLaneIndex: u32) -> T */
/* fn subgroupBroadcast[N : num, T : fiu32_f16](value: vec<N, T>, @const sourceLaneIndex: u32) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(405),
},
{
- /* [122] */
+ /* [123] */
+ /* fn subgroupBroadcastFirst[T : fiu32_f16](value: T) -> T */
+ /* fn subgroupBroadcastFirst[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
+ /* num overloads */ 2,
+ /* overloads */ OverloadIndex(407),
+ },
+ {
+ /* [124] */
/* fn subgroupAdd[T : fiu32_f16](value: T) -> T */
/* fn subgroupAdd[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(407),
},
{
- /* [123] */
+ /* [125] */
/* fn subgroupExclusiveAdd[T : fiu32_f16](value: T) -> T */
/* fn subgroupExclusiveAdd[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(407),
},
{
- /* [124] */
+ /* [126] */
/* fn subgroupMul[T : fiu32_f16](value: T) -> T */
/* fn subgroupMul[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(407),
},
{
- /* [125] */
+ /* [127] */
/* fn subgroupExclusiveMul[T : fiu32_f16](value: T) -> T */
/* fn subgroupExclusiveMul[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(407),
},
{
- /* [126] */
+ /* [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(409),
},
{
- /* [127] */
+ /* [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(409),
},
{
- /* [128] */
+ /* [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(409),
},
{
- /* [129] */
+ /* [131] */
/* fn subgroupMin[T : fiu32_f16](value: T) -> T */
/* fn subgroupMin[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(407),
},
{
- /* [130] */
+ /* [132] */
/* fn subgroupMax[T : fiu32_f16](value: T) -> T */
/* fn subgroupMax[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(407),
},
{
- /* [131] */
+ /* [133] */
/* fn subgroupAll(bool) -> bool */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(469),
+ /* overloads */ OverloadIndex(470),
},
{
- /* [132] */
+ /* [134] */
/* fn subgroupAny(bool) -> bool */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(469),
+ /* overloads */ OverloadIndex(470),
},
};
@@ -10707,13 +10731,13 @@
/* [8] */
/* op &&(bool, bool) -> bool */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(470),
+ /* overloads */ OverloadIndex(471),
},
{
/* [9] */
/* op ||(bool, bool) -> bool */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(471),
+ /* overloads */ OverloadIndex(472),
},
{
/* [10] */
diff --git a/src/tint/lang/core/ir/binary/decode.cc b/src/tint/lang/core/ir/binary/decode.cc
index 5bf4b72..299de3c 100644
--- a/src/tint/lang/core/ir/binary/decode.cc
+++ b/src/tint/lang/core/ir/binary/decode.cc
@@ -1625,8 +1625,12 @@
return core::BuiltinFn::kAtomicCompareExchangeWeak;
case pb::BuiltinFn::subgroup_ballot:
return core::BuiltinFn::kSubgroupBallot;
+ case pb::BuiltinFn::subgroup_elect:
+ return core::BuiltinFn::kSubgroupElect;
case pb::BuiltinFn::subgroup_broadcast:
return core::BuiltinFn::kSubgroupBroadcast;
+ case pb::BuiltinFn::subgroup_broadcast_first:
+ return core::BuiltinFn::kSubgroupBroadcastFirst;
case pb::BuiltinFn::input_attachment_load:
return core::BuiltinFn::kInputAttachmentLoad;
case pb::BuiltinFn::subgroup_add:
diff --git a/src/tint/lang/core/ir/binary/encode.cc b/src/tint/lang/core/ir/binary/encode.cc
index 741da4d..d2a20c9 100644
--- a/src/tint/lang/core/ir/binary/encode.cc
+++ b/src/tint/lang/core/ir/binary/encode.cc
@@ -1137,8 +1137,12 @@
return pb::BuiltinFn::atomic_compare_exchange_weak;
case core::BuiltinFn::kSubgroupBallot:
return pb::BuiltinFn::subgroup_ballot;
+ case core::BuiltinFn::kSubgroupElect:
+ return pb::BuiltinFn::subgroup_elect;
case core::BuiltinFn::kSubgroupBroadcast:
return pb::BuiltinFn::subgroup_broadcast;
+ case core::BuiltinFn::kSubgroupBroadcastFirst:
+ return pb::BuiltinFn::subgroup_broadcast_first;
case core::BuiltinFn::kInputAttachmentLoad:
return pb::BuiltinFn::input_attachment_load;
case core::BuiltinFn::kSubgroupAdd:
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 8dcd019..ea69f43 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -3096,8 +3096,12 @@
return "smoothstep";
case wgsl::BuiltinFn::kSubgroupBallot:
return "WaveActiveBallot";
+ case wgsl::BuiltinFn::kSubgroupElect:
+ return "WaveIsFirstLane";
case wgsl::BuiltinFn::kSubgroupBroadcast:
return "WaveReadLaneAt";
+ case wgsl::BuiltinFn::kSubgroupBroadcastFirst:
+ return "WaveReadLaneFirst";
case wgsl::BuiltinFn::kSubgroupAdd:
return "WaveActiveSum";
case wgsl::BuiltinFn::kSubgroupExclusiveAdd:
diff --git a/src/tint/lang/hlsl/writer/printer/printer.cc b/src/tint/lang/hlsl/writer/printer/printer.cc
index 14fd336..bcec0f1 100644
--- a/src/tint/lang/hlsl/writer/printer/printer.cc
+++ b/src/tint/lang/hlsl/writer/printer/printer.cc
@@ -993,9 +993,15 @@
case core::BuiltinFn::kSubgroupBallot:
out << "WaveActiveBallot";
break;
+ case core::BuiltinFn::kSubgroupElect:
+ out << "WaveIsFirstLane";
+ break;
case core::BuiltinFn::kSubgroupBroadcast:
out << "WaveReadLaneAt";
break;
+ case core::BuiltinFn::kSubgroupBroadcastFirst:
+ out << "WaveReadLaneFirst";
+ break;
case core::BuiltinFn::kWorkgroupBarrier:
out << "GroupMemoryBarrierWithGroupSync";
break;
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 a1296cf..584c7ef 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -791,6 +791,11 @@
break;
}
+ case wgsl::BuiltinFn::kSubgroupElect: {
+ out << "simd_is_first()";
+ return true;
+ }
+
case wgsl::BuiltinFn::kSubgroupBroadcast: {
// The lane argument is ushort.
out << "simd_broadcast(";
@@ -805,6 +810,15 @@
return true;
}
+ case wgsl::BuiltinFn::kSubgroupBroadcastFirst: {
+ out << "simd_broadcast_first(";
+ if (!EmitExpression(out, expr->args[0])) {
+ return false;
+ }
+ out << ")";
+ return true;
+ }
+
case wgsl::BuiltinFn::kSubgroupAdd: {
out << "simd_sum(";
if (!EmitExpression(out, expr->args[0])) {
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index d89fd9b..dd8b055 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -877,8 +877,7 @@
}
void EmitCoreBuiltinName(StringStream& out, core::BuiltinFn func) {
- // TODO(crbug.com/354738715): Implement subgroupBallot and subgroupBroadcast in MSL
- // IR backend.
+ // TODO(crbug.com/354738715): Implement subgroupBallot in MSL IR backend.
switch (func) {
case core::BuiltinFn::kAbs:
case core::BuiltinFn::kAcos:
@@ -979,6 +978,15 @@
case core::BuiltinFn::kSmoothstep:
out << "smoothstep";
break;
+ case core::BuiltinFn::kSubgroupElect:
+ out << "simd_is_first";
+ break;
+ case core::BuiltinFn::kSubgroupBroadcast:
+ out << "simd_broadcast";
+ break;
+ case core::BuiltinFn::kSubgroupBroadcastFirst:
+ out << "simd_broadcast_first";
+ break;
case core::BuiltinFn::kSubgroupAdd:
out << "simd_sum";
break;
diff --git a/src/tint/lang/spirv/writer/ast_printer/builder.cc b/src/tint/lang/spirv/writer/ast_printer/builder.cc
index 9625a86..1b877ec 100644
--- a/src/tint/lang/spirv/writer/ast_printer/builder.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/builder.cc
@@ -2575,7 +2575,9 @@
case wgsl::BuiltinFn::kSubgroupMin:
case wgsl::BuiltinFn::kSubgroupMax:
case wgsl::BuiltinFn::kSubgroupAll:
- case wgsl::BuiltinFn::kSubgroupAny: {
+ case wgsl::BuiltinFn::kSubgroupAny:
+ case wgsl::BuiltinFn::kSubgroupElect:
+ case wgsl::BuiltinFn::kSubgroupBroadcastFirst: {
// 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;
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index eb40a7f..67d488f 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -1681,11 +1681,21 @@
op = spv::Op::OpGroupNonUniformBallot;
operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
break;
+ case core::BuiltinFn::kSubgroupElect:
+ module_.PushCapability(SpvCapabilityGroupNonUniform);
+ op = spv::Op::OpGroupNonUniformElect;
+ operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
+ break;
case core::BuiltinFn::kSubgroupBroadcast:
module_.PushCapability(SpvCapabilityGroupNonUniformBallot);
op = spv::Op::OpGroupNonUniformBroadcast;
operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
break;
+ case core::BuiltinFn::kSubgroupBroadcastFirst:
+ module_.PushCapability(SpvCapabilityGroupNonUniformBallot);
+ op = spv::Op::OpGroupNonUniformBroadcastFirst;
+ operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
+ break;
case core::BuiltinFn::kSubgroupAnd:
module_.PushCapability(SpvCapabilityGroupNonUniformArithmetic);
op = spv::Op::OpGroupNonUniformBitwiseAnd;
diff --git a/src/tint/lang/wgsl/builtin_fn.cc b/src/tint/lang/wgsl/builtin_fn.cc
index ed76cfc..5149270 100644
--- a/src/tint/lang/wgsl/builtin_fn.cc
+++ b/src/tint/lang/wgsl/builtin_fn.cc
@@ -408,9 +408,15 @@
if (name == "subgroupBallot") {
return BuiltinFn::kSubgroupBallot;
}
+ if (name == "subgroupElect") {
+ return BuiltinFn::kSubgroupElect;
+ }
if (name == "subgroupBroadcast") {
return BuiltinFn::kSubgroupBroadcast;
}
+ if (name == "subgroupBroadcastFirst") {
+ return BuiltinFn::kSubgroupBroadcastFirst;
+ }
if (name == "subgroupAdd") {
return BuiltinFn::kSubgroupAdd;
}
@@ -700,8 +706,12 @@
return "atomicCompareExchangeWeak";
case BuiltinFn::kSubgroupBallot:
return "subgroupBallot";
+ case BuiltinFn::kSubgroupElect:
+ return "subgroupElect";
case BuiltinFn::kSubgroupBroadcast:
return "subgroupBroadcast";
+ case BuiltinFn::kSubgroupBroadcastFirst:
+ return "subgroupBroadcastFirst";
case BuiltinFn::kSubgroupAdd:
return "subgroupAdd";
case BuiltinFn::kSubgroupExclusiveAdd:
@@ -799,7 +809,9 @@
bool IsSubgroup(BuiltinFn f) {
switch (f) {
case BuiltinFn::kSubgroupBallot:
+ case BuiltinFn::kSubgroupElect:
case BuiltinFn::kSubgroupBroadcast:
+ case BuiltinFn::kSubgroupBroadcastFirst:
case BuiltinFn::kSubgroupAdd:
case BuiltinFn::kSubgroupExclusiveAdd:
case BuiltinFn::kSubgroupMul:
diff --git a/src/tint/lang/wgsl/builtin_fn.cc.tmpl b/src/tint/lang/wgsl/builtin_fn.cc.tmpl
index 1f5b736..29b6358 100644
--- a/src/tint/lang/wgsl/builtin_fn.cc.tmpl
+++ b/src/tint/lang/wgsl/builtin_fn.cc.tmpl
@@ -110,7 +110,9 @@
bool IsSubgroup(BuiltinFn f) {
switch (f) {
case BuiltinFn::kSubgroupBallot:
+ case BuiltinFn::kSubgroupElect:
case BuiltinFn::kSubgroupBroadcast:
+ case BuiltinFn::kSubgroupBroadcastFirst:
case BuiltinFn::kSubgroupAdd:
case BuiltinFn::kSubgroupExclusiveAdd:
case BuiltinFn::kSubgroupMul:
diff --git a/src/tint/lang/wgsl/builtin_fn.h b/src/tint/lang/wgsl/builtin_fn.h
index b3ef461..252ca78 100644
--- a/src/tint/lang/wgsl/builtin_fn.h
+++ b/src/tint/lang/wgsl/builtin_fn.h
@@ -170,7 +170,9 @@
kAtomicExchange,
kAtomicCompareExchangeWeak,
kSubgroupBallot,
+ kSubgroupElect,
kSubgroupBroadcast,
+ kSubgroupBroadcastFirst,
kSubgroupAdd,
kSubgroupExclusiveAdd,
kSubgroupMul,
@@ -328,7 +330,9 @@
BuiltinFn::kAtomicExchange,
BuiltinFn::kAtomicCompareExchangeWeak,
BuiltinFn::kSubgroupBallot,
+ BuiltinFn::kSubgroupElect,
BuiltinFn::kSubgroupBroadcast,
+ BuiltinFn::kSubgroupBroadcastFirst,
BuiltinFn::kSubgroupAdd,
BuiltinFn::kSubgroupExclusiveAdd,
BuiltinFn::kSubgroupMul,
@@ -468,7 +472,9 @@
"atomicExchange",
"atomicCompareExchangeWeak",
"subgroupBallot",
+ "subgroupElect",
"subgroupBroadcast",
+ "subgroupBroadcastFirst",
"subgroupAdd",
"subgroupExclusiveAdd",
"subgroupMul",
diff --git a/src/tint/lang/wgsl/intrinsic/data.cc b/src/tint/lang/wgsl/intrinsic/data.cc
index 610515f..b3ba683 100644
--- a/src/tint/lang/wgsl/intrinsic/data.cc
+++ b/src/tint/lang/wgsl/intrinsic/data.cc
@@ -11016,6 +11016,17 @@
{
/* [547] */
/* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+ /* num_parameters */ 0,
+ /* num_explicit_templates */ 0,
+ /* num_templates */ 0,
+ /* templates */ TemplateIndex(/* invalid */),
+ /* parameters */ ParameterIndex(/* invalid */),
+ /* return_matcher_indices */ MatcherIndicesIndex(55),
+ /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+ },
+ {
+ /* [548] */
+ /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
/* num_parameters */ 1,
/* num_explicit_templates */ 0,
/* num_templates */ 0,
@@ -11025,7 +11036,7 @@
/* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
},
{
- /* [548] */
+ /* [549] */
/* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
/* num_parameters */ 1,
/* num_explicit_templates */ 0,
@@ -11036,7 +11047,7 @@
/* const_eval_fn */ ConstEvalFunctionIndex(82),
},
{
- /* [549] */
+ /* [550] */
/* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
/* num_parameters */ 1,
/* num_explicit_templates */ 0,
@@ -11047,7 +11058,7 @@
/* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
},
{
- /* [550] */
+ /* [551] */
/* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
/* num_parameters */ 1,
/* num_explicit_templates */ 0,
@@ -11058,7 +11069,7 @@
/* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
},
{
- /* [551] */
+ /* [552] */
/* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
/* num_parameters */ 2,
/* num_explicit_templates */ 0,
@@ -11069,7 +11080,7 @@
/* const_eval_fn */ ConstEvalFunctionIndex(97),
},
{
- /* [552] */
+ /* [553] */
/* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
/* num_parameters */ 2,
/* num_explicit_templates */ 0,
@@ -12056,91 +12067,104 @@
},
{
/* [123] */
+ /* fn subgroupElect() -> bool */
+ /* num overloads */ 1,
+ /* overloads */ OverloadIndex(547),
+ },
+ {
+ /* [124] */
/* fn subgroupBroadcast[T : fiu32_f16](value: T, @const sourceLaneIndex: u32) -> T */
/* fn subgroupBroadcast[N : num, T : fiu32_f16](value: vec<N, T>, @const sourceLaneIndex: u32) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(481),
},
{
- /* [124] */
+ /* [125] */
+ /* fn subgroupBroadcastFirst[T : fiu32_f16](value: T) -> T */
+ /* fn subgroupBroadcastFirst[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
+ /* num overloads */ 2,
+ /* overloads */ OverloadIndex(483),
+ },
+ {
+ /* [126] */
/* fn subgroupAdd[T : fiu32_f16](value: T) -> T */
/* fn subgroupAdd[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(483),
},
{
- /* [125] */
+ /* [127] */
/* fn subgroupExclusiveAdd[T : fiu32_f16](value: T) -> T */
/* fn subgroupExclusiveAdd[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(483),
},
{
- /* [126] */
+ /* [128] */
/* fn subgroupMul[T : fiu32_f16](value: T) -> T */
/* fn subgroupMul[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(483),
},
{
- /* [127] */
+ /* [129] */
/* fn subgroupExclusiveMul[T : fiu32_f16](value: T) -> T */
/* fn subgroupExclusiveMul[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(483),
},
{
- /* [128] */
+ /* [130] */
/* 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] */
+ /* [131] */
/* 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] */
+ /* [132] */
/* 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] */
+ /* [133] */
/* fn subgroupMin[T : fiu32_f16](value: T) -> T */
/* fn subgroupMin[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(483),
},
{
- /* [132] */
+ /* [134] */
/* fn subgroupMax[T : fiu32_f16](value: T) -> T */
/* fn subgroupMax[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ OverloadIndex(483),
},
{
- /* [133] */
+ /* [135] */
/* fn subgroupAll(bool) -> bool */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(547),
+ /* overloads */ OverloadIndex(548),
},
{
- /* [134] */
+ /* [136] */
/* fn subgroupAny(bool) -> bool */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(547),
+ /* overloads */ OverloadIndex(548),
},
{
- /* [135] */
+ /* [137] */
/* fn __tint_materialize[T](T) -> T */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(548),
+ /* overloads */ OverloadIndex(549),
},
};
@@ -12149,13 +12173,13 @@
/* [0] */
/* op &[S : address_space, T, A : access](ref<S, T, A>) -> ptr<S, T, A> */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(549),
+ /* overloads */ OverloadIndex(550),
},
{
/* [1] */
/* op *[S : address_space, T, A : access](ptr<S, T, A>) -> ref<S, T, A> */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(550),
+ /* overloads */ OverloadIndex(551),
},
{
/* [2] */
@@ -12267,13 +12291,13 @@
/* [8] */
/* op &&(bool, bool) -> bool */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(551),
+ /* overloads */ OverloadIndex(552),
},
{
/* [9] */
/* op ||(bool, bool) -> bool */
/* num overloads */ 1,
- /* overloads */ OverloadIndex(552),
+ /* overloads */ OverloadIndex(553),
},
{
/* [10] */
diff --git a/src/tint/lang/wgsl/reader/lower/lower.cc b/src/tint/lang/wgsl/reader/lower/lower.cc
index c8c2964..1330270 100644
--- a/src/tint/lang/wgsl/reader/lower/lower.cc
+++ b/src/tint/lang/wgsl/reader/lower/lower.cc
@@ -166,7 +166,9 @@
CASE(kAtomicExchange)
CASE(kAtomicCompareExchangeWeak)
CASE(kSubgroupBallot)
+ CASE(kSubgroupElect)
CASE(kSubgroupBroadcast)
+ CASE(kSubgroupBroadcastFirst)
CASE(kInputAttachmentLoad)
CASE(kSubgroupAdd)
CASE(kSubgroupExclusiveAdd)
diff --git a/src/tint/lang/wgsl/wgsl.def b/src/tint/lang/wgsl/wgsl.def
index 8e9320a..c254bb0 100644
--- a/src/tint/lang/wgsl/wgsl.def
+++ b/src/tint/lang/wgsl/wgsl.def
@@ -620,8 +620,11 @@
@stage("fragment", "compute") fn atomicCompareExchangeWeak[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T, T) -> __atomic_compare_exchange_result<T>
@must_use @stage("fragment", "compute") fn subgroupBallot(bool) -> vec4<u32>
+@must_use @stage("fragment", "compute") fn subgroupElect() -> bool
@must_use @stage("fragment", "compute") fn subgroupBroadcast[T: fiu32_f16](value: T, @const sourceLaneIndex: u32) -> T
@must_use @stage("fragment", "compute") fn subgroupBroadcast[N: num, T: fiu32_f16](value: vec<N, T>, @const sourceLaneIndex: u32) -> vec<N, T>
+@must_use @stage("fragment", "compute") fn subgroupBroadcastFirst[T: fiu32_f16](value: T) -> T
+@must_use @stage("fragment", "compute") fn subgroupBroadcastFirst[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
@must_use @stage("fragment", "compute") fn subgroupAdd[T: fiu32_f16](value: T) -> T
@must_use @stage("fragment", "compute") fn subgroupAdd[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
@must_use @stage("fragment", "compute") fn subgroupExclusiveAdd[T: fiu32_f16](value: T) -> T
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 5ea6cf7..b001b88 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
@@ -645,7 +645,9 @@
switch (c->Func()) {
case wgsl::BuiltinFn::kSubgroupBallot:
+ case wgsl::BuiltinFn::kSubgroupElect:
case wgsl::BuiltinFn::kSubgroupBroadcast:
+ case wgsl::BuiltinFn::kSubgroupBroadcastFirst:
case wgsl::BuiltinFn::kSubgroupAdd:
case wgsl::BuiltinFn::kSubgroupExclusiveAdd:
case wgsl::BuiltinFn::kSubgroupMul:
diff --git a/src/tint/lang/wgsl/writer/raise/raise.cc b/src/tint/lang/wgsl/writer/raise/raise.cc
index 2d9da3c..a792de5 100644
--- a/src/tint/lang/wgsl/writer/raise/raise.cc
+++ b/src/tint/lang/wgsl/writer/raise/raise.cc
@@ -170,7 +170,9 @@
CASE(kAtomicExchange)
CASE(kAtomicCompareExchangeWeak)
CASE(kSubgroupBallot)
+ CASE(kSubgroupElect)
CASE(kSubgroupBroadcast)
+ CASE(kSubgroupBroadcastFirst)
CASE(kSubgroupAdd)
CASE(kSubgroupExclusiveAdd)
CASE(kSubgroupMul)
diff --git a/src/tint/utils/protos/ir/ir.proto b/src/tint/utils/protos/ir/ir.proto
index d4a723f..ac1e777 100644
--- a/src/tint/utils/protos/ir/ir.proto
+++ b/src/tint/utils/protos/ir/ir.proto
@@ -643,4 +643,6 @@
subgroup_max = 130;
subgroup_any = 131;
subgroup_all = 132;
+ subgroup_elect = 133;
+ subgroup_broadcast_first = 134;
}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.ir.msl
index a4963e5..44d912c 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/07e2d8.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device half* prevent_dce;
+};
+
+half subgroupBroadcast_07e2d8() {
+ half res = simd_broadcast(1.0h, 1u);
+ 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) = subgroupBroadcast_07e2d8();
+}
+
+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) = subgroupBroadcast_07e2d8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.ir.msl
index a4963e5..9b933c5 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/08beca.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device float* prevent_dce;
+};
+
+float subgroupBroadcast_08beca() {
+ float res = simd_broadcast(1.0f, 1u);
+ 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) = subgroupBroadcast_08beca();
+}
+
+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) = subgroupBroadcast_08beca();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.ir.msl
index a4963e5..cfe7aab 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/0f44e2.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device half4* prevent_dce;
+};
+
+half4 subgroupBroadcast_0f44e2() {
+ half4 res = simd_broadcast(half4(1.0h), 1u);
+ 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) = subgroupBroadcast_0f44e2();
+}
+
+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) = subgroupBroadcast_0f44e2();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.ir.msl
index a4963e5..553a330 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/13f36c.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device half2* prevent_dce;
+};
+
+half2 subgroupBroadcast_13f36c() {
+ half2 res = simd_broadcast(half2(1.0h), 1u);
+ 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) = subgroupBroadcast_13f36c();
+}
+
+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) = subgroupBroadcast_13f36c();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.ir.msl
index a4963e5..7ac5a66 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/1d79c7.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device int* prevent_dce;
+};
+
+int subgroupBroadcast_1d79c7() {
+ int res = simd_broadcast(1, 1u);
+ 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) = subgroupBroadcast_1d79c7();
+}
+
+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) = subgroupBroadcast_1d79c7();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.ir.msl
index a4963e5..8075693 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/279027.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device uint4* prevent_dce;
+};
+
+uint4 subgroupBroadcast_279027() {
+ uint4 res = simd_broadcast(uint4(1u), 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) = subgroupBroadcast_279027();
+}
+
+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) = subgroupBroadcast_279027();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.ir.msl
index a4963e5..2119792 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/34fa3d.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device uint3* prevent_dce;
+};
+
+uint3 subgroupBroadcast_34fa3d() {
+ uint3 res = simd_broadcast(uint3(1u), 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) = subgroupBroadcast_34fa3d();
+}
+
+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) = subgroupBroadcast_34fa3d();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.ir.msl
index a4963e5..73b0c08 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/3e6879.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device int2* prevent_dce;
+};
+
+int2 subgroupBroadcast_3e6879() {
+ int2 res = simd_broadcast(int2(1), 1u);
+ 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) = subgroupBroadcast_3e6879();
+}
+
+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) = subgroupBroadcast_3e6879();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.ir.msl
index a4963e5..e453830 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/41e5d7.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device half3* prevent_dce;
+};
+
+half3 subgroupBroadcast_41e5d7() {
+ half3 res = simd_broadcast(half3(1.0h), 1u);
+ 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) = subgroupBroadcast_41e5d7();
+}
+
+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) = subgroupBroadcast_41e5d7();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.ir.msl
index a4963e5..ea0d3f8 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/4a4334.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device uint2* prevent_dce;
+};
+
+uint2 subgroupBroadcast_4a4334() {
+ uint2 res = simd_broadcast(uint2(1u), 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) = subgroupBroadcast_4a4334();
+}
+
+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) = subgroupBroadcast_4a4334();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.ir.msl
index a4963e5..7651aab 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/5196c8.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device float2* prevent_dce;
+};
+
+float2 subgroupBroadcast_5196c8() {
+ float2 res = simd_broadcast(float2(1.0f), 1u);
+ 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) = subgroupBroadcast_5196c8();
+}
+
+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) = subgroupBroadcast_5196c8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.ir.msl
index a4963e5..dc31194 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/912ff5.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device float3* prevent_dce;
+};
+
+float3 subgroupBroadcast_912ff5() {
+ float3 res = simd_broadcast(float3(1.0f), 1u);
+ 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) = subgroupBroadcast_912ff5();
+}
+
+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) = subgroupBroadcast_912ff5();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.ir.msl
index a4963e5..74fbc02 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/b7e93b.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device float4* prevent_dce;
+};
+
+float4 subgroupBroadcast_b7e93b() {
+ float4 res = simd_broadcast(float4(1.0f), 1u);
+ 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) = subgroupBroadcast_b7e93b();
+}
+
+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) = subgroupBroadcast_b7e93b();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.ir.msl
index a4963e5..518ad77 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/c36fe1.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device uint* prevent_dce;
+};
+
+uint subgroupBroadcast_c36fe1() {
+ uint res = simd_broadcast(1u, 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) = subgroupBroadcast_c36fe1();
+}
+
+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) = subgroupBroadcast_c36fe1();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.ir.msl
index a4963e5..c59403b 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/e275c8.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device int3* prevent_dce;
+};
+
+int3 subgroupBroadcast_e275c8() {
+ int3 res = simd_broadcast(int3(1), 1u);
+ 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) = subgroupBroadcast_e275c8();
+}
+
+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) = subgroupBroadcast_e275c8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.ir.msl
index a4963e5..ea80463 100644
--- a/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/literal/subgroupBroadcast/f637f9.wgsl.expected.ir.msl
@@ -1,9 +1,21 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device int4* prevent_dce;
+};
+
+int4 subgroupBroadcast_f637f9() {
+ int4 res = simd_broadcast(int4(1), 1u);
+ 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) = subgroupBroadcast_f637f9();
+}
+
+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) = subgroupBroadcast_f637f9();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl
new file mode 100644
index 0000000..cc7d0e6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.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 : f32;
+
+
+// fn subgroupBroadcastFirst(value: f32) -> f32
+fn subgroupBroadcastFirst_0538e1() -> f32{
+ var res: f32 = subgroupBroadcastFirst(1.f);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..aae6401
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float subgroupBroadcastFirst_0538e1() {
+ float res = WaveReadLaneFirst(1.0f);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d501fa3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float subgroupBroadcastFirst_0538e1() {
+ float res = WaveReadLaneFirst(1.0f);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.glsl
new file mode 100644
index 0000000..8637f6c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupBroadcastFirst_0538e1() -> f32 {
+ var res : f32 = subgroupBroadcastFirst(1.0f);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupBroadcastFirst_0538e1() -> f32 {
+ var res : f32 = subgroupBroadcastFirst(1.0f);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..b1a5659
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+float subgroupBroadcastFirst_0538e1() {
+ float res = WaveReadLaneFirst(1.0f);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.msl
new file mode 100644
index 0000000..5d27147
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device float* prevent_dce;
+};
+
+float subgroupBroadcastFirst_0538e1() {
+ float res = simd_broadcast_first(1.0f);
+ 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) = subgroupBroadcastFirst_0538e1();
+}
+
+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) = subgroupBroadcastFirst_0538e1();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..e7b5e4d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_0538e1 "subgroupBroadcastFirst_0538e1"
+ 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
+ %float = OpTypeFloat 32
+%tint_symbol_1 = OpTypeStruct %float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %6 = OpTypeFunction %float
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %float_1 = OpConstant %float 1
+%_ptr_Function_float = OpTypePointer Function %float
+ %void = OpTypeVoid
+ %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_0538e1 = OpFunction %float None %6
+ %7 = OpLabel
+ %res = OpVariable %_ptr_Function_float Function
+ %8 = OpGroupNonUniformBroadcastFirst %float %uint_3 %float_1
+ OpStore %res %8
+ %14 = OpLoad %float %res
+ OpReturnValue %14
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %17
+ %18 = OpLabel
+ %19 = OpFunctionCall %float %subgroupBroadcastFirst_0538e1
+ %20 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+ OpStore %20 %19
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %17
+ %24 = OpLabel
+ %25 = OpFunctionCall %float %subgroupBroadcastFirst_0538e1
+ %26 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+ OpStore %26 %25
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.msl
new file mode 100644
index 0000000..3fb98a6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+float subgroupBroadcastFirst_0538e1() {
+ float res = simd_broadcast_first(1.0f);
+ return res;
+}
+
+fragment void fragment_main(device float* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_0538e1();
+ return;
+}
+
+kernel void compute_main(device float* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_0538e1();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.spvasm
new file mode 100644
index 0000000..e8ecd1f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupBroadcastFirst_0538e1() -> f32 {
+ var res : f32 = subgroupBroadcastFirst(1.0f);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.wgsl
new file mode 100644
index 0000000..1e0de33
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0538e1.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupBroadcastFirst_0538e1() -> f32 {
+ var res : f32 = subgroupBroadcastFirst(1.0f);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl
new file mode 100644
index 0000000..ee61732
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl
@@ -0,0 +1,62 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+// test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+
+// fn subgroupBroadcastFirst(value: vec<3, f16>) -> vec<3, f16>
+fn subgroupBroadcastFirst_0e58ec() -> vec3<f16>{
+ var res: vec3<f16> = subgroupBroadcastFirst(vec3<f16>(1.h));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..101c4e8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 3> subgroupBroadcastFirst_0e58ec() {
+ vector<float16_t, 3> res = WaveReadLaneFirst((float16_t(1.0h)).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..80d043a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 3> subgroupBroadcastFirst_0e58ec() {
+ vector<float16_t, 3> res = WaveReadLaneFirst((float16_t(1.0h)).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.glsl
new file mode 100644
index 0000000..8b86f63
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.glsl
@@ -0,0 +1,54 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+fn subgroupBroadcastFirst_0e58ec() -> vec3<f16> {
+ var res : vec3<f16> = subgroupBroadcastFirst(vec3<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+fn subgroupBroadcastFirst_0e58ec() -> vec3<f16> {
+ var res : vec3<f16> = subgroupBroadcastFirst(vec3<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..40adfbb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+vector<float16_t, 3> subgroupBroadcastFirst_0e58ec() {
+ vector<float16_t, 3> res = WaveReadLaneFirst((float16_t(1.0h)).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.msl
new file mode 100644
index 0000000..d351a43
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device half3* prevent_dce;
+};
+
+half3 subgroupBroadcastFirst_0e58ec() {
+ half3 res = simd_broadcast_first(half3(1.0h));
+ 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) = subgroupBroadcastFirst_0e58ec();
+}
+
+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) = subgroupBroadcastFirst_0e58ec();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..685ca6c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+ OpCapability Shader
+ OpCapability Float16
+ OpCapability UniformAndStorageBuffer16BitAccess
+ OpCapability StorageBuffer16BitAccess
+ OpCapability GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_0e58ec "subgroupBroadcastFirst_0e58ec"
+ 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
+ %half = OpTypeFloat 16
+ %v3half = OpTypeVector %half 3
+%tint_symbol_1 = OpTypeStruct %v3half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v3half
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+ %12 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v3half = OpTypePointer Function %v3half
+ %void = OpTypeVoid
+ %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3half = OpTypePointer StorageBuffer %v3half
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_0e58ec = OpFunction %v3half None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v3half Function
+ %9 = OpGroupNonUniformBroadcastFirst %v3half %uint_3 %12
+ OpStore %res %9
+ %16 = OpLoad %v3half %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %v3half %subgroupBroadcastFirst_0e58ec
+ %22 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %v3half %subgroupBroadcastFirst_0e58ec
+ %28 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.msl
new file mode 100644
index 0000000..0c65ec9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+half3 subgroupBroadcastFirst_0e58ec() {
+ half3 res = simd_broadcast_first(half3(1.0h));
+ return res;
+}
+
+fragment void fragment_main(device packed_half3* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = packed_half3(subgroupBroadcastFirst_0e58ec());
+ return;
+}
+
+kernel void compute_main(device packed_half3* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = packed_half3(subgroupBroadcastFirst_0e58ec());
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.spvasm
new file mode 100644
index 0000000..ba27f32
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+fn subgroupBroadcastFirst_0e58ec() -> vec3<f16> {
+ var res : vec3<f16> = subgroupBroadcastFirst(vec3<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.wgsl
new file mode 100644
index 0000000..017b4c5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/0e58ec.wgsl.expected.wgsl
@@ -0,0 +1,20 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+fn subgroupBroadcastFirst_0e58ec() -> vec3<f16> {
+ var res : vec3<f16> = subgroupBroadcastFirst(vec3<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl
new file mode 100644
index 0000000..99859be
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl
@@ -0,0 +1,62 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+// test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+
+// fn subgroupBroadcastFirst(value: f16) -> f16
+fn subgroupBroadcastFirst_151e52() -> f16{
+ var res: f16 = subgroupBroadcastFirst(1.h);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b72cf2a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float16_t subgroupBroadcastFirst_151e52() {
+ float16_t res = WaveReadLaneFirst(float16_t(1.0h));
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..35ee8bc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float16_t subgroupBroadcastFirst_151e52() {
+ float16_t res = WaveReadLaneFirst(float16_t(1.0h));
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.glsl
new file mode 100644
index 0000000..94491c8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.glsl
@@ -0,0 +1,54 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupBroadcastFirst_151e52() -> f16 {
+ var res : f16 = subgroupBroadcastFirst(1.0h);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupBroadcastFirst_151e52() -> f16 {
+ var res : f16 = subgroupBroadcastFirst(1.0h);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..91e643b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+float16_t subgroupBroadcastFirst_151e52() {
+ float16_t res = WaveReadLaneFirst(float16_t(1.0h));
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.ir.msl
new file mode 100644
index 0000000..da5b93e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device half* prevent_dce;
+};
+
+half subgroupBroadcastFirst_151e52() {
+ half res = simd_broadcast_first(1.0h);
+ 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) = subgroupBroadcastFirst_151e52();
+}
+
+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) = subgroupBroadcastFirst_151e52();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..0d59821
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.ir.spvasm
@@ -0,0 +1,60 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+ OpCapability Shader
+ OpCapability Float16
+ OpCapability UniformAndStorageBuffer16BitAccess
+ OpCapability StorageBuffer16BitAccess
+ OpCapability GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_151e52 "subgroupBroadcastFirst_151e52"
+ 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
+ %half = OpTypeFloat 16
+%tint_symbol_1 = OpTypeStruct %half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %6 = OpTypeFunction %half
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%_ptr_Function_half = OpTypePointer Function %half
+ %void = OpTypeVoid
+ %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_151e52 = OpFunction %half None %6
+ %7 = OpLabel
+ %res = OpVariable %_ptr_Function_half Function
+ %8 = OpGroupNonUniformBroadcastFirst %half %uint_3 %half_0x1p_0
+ OpStore %res %8
+ %14 = OpLoad %half %res
+ OpReturnValue %14
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %17
+ %18 = OpLabel
+ %19 = OpFunctionCall %half %subgroupBroadcastFirst_151e52
+ %20 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+ OpStore %20 %19
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %17
+ %24 = OpLabel
+ %25 = OpFunctionCall %half %subgroupBroadcastFirst_151e52
+ %26 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+ OpStore %26 %25
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.msl
new file mode 100644
index 0000000..08e80e9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+half subgroupBroadcastFirst_151e52() {
+ half res = simd_broadcast_first(1.0h);
+ return res;
+}
+
+fragment void fragment_main(device half* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_151e52();
+ return;
+}
+
+kernel void compute_main(device half* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_151e52();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.spvasm
new file mode 100644
index 0000000..d26ab92
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupBroadcastFirst_151e52() -> f16 {
+ var res : f16 = subgroupBroadcastFirst(1.0h);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.wgsl
new file mode 100644
index 0000000..7572e93
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/151e52.wgsl.expected.wgsl
@@ -0,0 +1,20 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupBroadcastFirst_151e52() -> f16 {
+ var res : f16 = subgroupBroadcastFirst(1.0h);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl
new file mode 100644
index 0000000..3d815f1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.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 subgroupBroadcastFirst(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupBroadcastFirst_1d9530() -> vec2<u32>{
+ var res: vec2<u32> = subgroupBroadcastFirst(vec2<u32>(1u));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..5a0b799
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupBroadcastFirst_1d9530() {
+ uint2 res = WaveReadLaneFirst((1u).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_1d9530()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_1d9530()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..69f0a5d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupBroadcastFirst_1d9530() {
+ uint2 res = WaveReadLaneFirst((1u).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_1d9530()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_1d9530()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.glsl
new file mode 100644
index 0000000..e4c20f6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupBroadcastFirst_1d9530() -> vec2<u32> {
+ var res : vec2<u32> = subgroupBroadcastFirst(vec2<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupBroadcastFirst_1d9530() -> vec2<u32> {
+ var res : vec2<u32> = subgroupBroadcastFirst(vec2<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..ae2a493
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint2 subgroupBroadcastFirst_1d9530() {
+ uint2 res = WaveReadLaneFirst((1u).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, subgroupBroadcastFirst_1d9530());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, subgroupBroadcastFirst_1d9530());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.msl
new file mode 100644
index 0000000..66cfbc6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device uint2* prevent_dce;
+};
+
+uint2 subgroupBroadcastFirst_1d9530() {
+ uint2 res = simd_broadcast_first(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) = subgroupBroadcastFirst_1d9530();
+}
+
+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) = subgroupBroadcastFirst_1d9530();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..d22c543
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_1d9530 "subgroupBroadcastFirst_1d9530"
+ 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
+%subgroupBroadcastFirst_1d9530 = OpFunction %v2uint None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v2uint Function
+ %9 = OpGroupNonUniformBroadcastFirst %v2uint %uint_3 %11
+ OpStore %res %9
+ %15 = OpLoad %v2uint %res
+ OpReturnValue %15
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+ %19 = OpLabel
+ %20 = OpFunctionCall %v2uint %subgroupBroadcastFirst_1d9530
+ %21 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+ OpStore %21 %20
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %18
+ %25 = OpLabel
+ %26 = OpFunctionCall %v2uint %subgroupBroadcastFirst_1d9530
+ %27 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+ OpStore %27 %26
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.msl
new file mode 100644
index 0000000..fb25380
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint2 subgroupBroadcastFirst_1d9530() {
+ uint2 res = simd_broadcast_first(uint2(1u));
+ return res;
+}
+
+fragment void fragment_main(device uint2* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_1d9530();
+ return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_1d9530();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.spvasm
new file mode 100644
index 0000000..577de93
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupBroadcastFirst_1d9530() -> vec2<u32> {
+ var res : vec2<u32> = subgroupBroadcastFirst(vec2<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.wgsl
new file mode 100644
index 0000000..8e2a317
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/1d9530.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupBroadcastFirst_1d9530() -> vec2<u32> {
+ var res : vec2<u32> = subgroupBroadcastFirst(vec2<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl
new file mode 100644
index 0000000..44d9dae
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.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<f32>;
+
+
+// fn subgroupBroadcastFirst(value: vec<3, f32>) -> vec<3, f32>
+fn subgroupBroadcastFirst_5c6962() -> vec3<f32>{
+ var res: vec3<f32> = subgroupBroadcastFirst(vec3<f32>(1.f));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f3bf472
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float3 subgroupBroadcastFirst_5c6962() {
+ float3 res = WaveReadLaneFirst((1.0f).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..cea4dce
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float3 subgroupBroadcastFirst_5c6962() {
+ float3 res = WaveReadLaneFirst((1.0f).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.glsl
new file mode 100644
index 0000000..c758325
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+fn subgroupBroadcastFirst_5c6962() -> vec3<f32> {
+ var res : vec3<f32> = subgroupBroadcastFirst(vec3<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+fn subgroupBroadcastFirst_5c6962() -> vec3<f32> {
+ var res : vec3<f32> = subgroupBroadcastFirst(vec3<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..238c8f3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+float3 subgroupBroadcastFirst_5c6962() {
+ float3 res = WaveReadLaneFirst((1.0f).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.msl
new file mode 100644
index 0000000..bb1b0a2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device float3* prevent_dce;
+};
+
+float3 subgroupBroadcastFirst_5c6962() {
+ float3 res = simd_broadcast_first(float3(1.0f));
+ 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) = subgroupBroadcastFirst_5c6962();
+}
+
+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) = subgroupBroadcastFirst_5c6962();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..f4d3da2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_5c6962 "subgroupBroadcastFirst_5c6962"
+ 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
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%tint_symbol_1 = OpTypeStruct %v3float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v3float
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %void = OpTypeVoid
+ %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_5c6962 = OpFunction %v3float None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v3float Function
+ %9 = OpGroupNonUniformBroadcastFirst %v3float %uint_3 %12
+ OpStore %res %9
+ %16 = OpLoad %v3float %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %v3float %subgroupBroadcastFirst_5c6962
+ %22 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %v3float %subgroupBroadcastFirst_5c6962
+ %28 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.msl
new file mode 100644
index 0000000..0815c4c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+float3 subgroupBroadcastFirst_5c6962() {
+ float3 res = simd_broadcast_first(float3(1.0f));
+ return res;
+}
+
+fragment void fragment_main(device packed_float3* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = packed_float3(subgroupBroadcastFirst_5c6962());
+ return;
+}
+
+kernel void compute_main(device packed_float3* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = packed_float3(subgroupBroadcastFirst_5c6962());
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.spvasm
new file mode 100644
index 0000000..d763545
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+fn subgroupBroadcastFirst_5c6962() -> vec3<f32> {
+ var res : vec3<f32> = subgroupBroadcastFirst(vec3<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.wgsl
new file mode 100644
index 0000000..fddb9a7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5c6962.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+fn subgroupBroadcastFirst_5c6962() -> vec3<f32> {
+ var res : vec3<f32> = subgroupBroadcastFirst(vec3<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl
new file mode 100644
index 0000000..86bea74
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.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 subgroupBroadcastFirst(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupBroadcastFirst_5e5b6f() -> vec3<u32>{
+ var res: vec3<u32> = subgroupBroadcastFirst(vec3<u32>(1u));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a30159c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupBroadcastFirst_5e5b6f() {
+ uint3 res = WaveReadLaneFirst((1u).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5e5b6f()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5e5b6f()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9042357
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupBroadcastFirst_5e5b6f() {
+ uint3 res = WaveReadLaneFirst((1u).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5e5b6f()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5e5b6f()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.glsl
new file mode 100644
index 0000000..df0010a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupBroadcastFirst_5e5b6f() -> vec3<u32> {
+ var res : vec3<u32> = subgroupBroadcastFirst(vec3<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupBroadcastFirst_5e5b6f() -> vec3<u32> {
+ var res : vec3<u32> = subgroupBroadcastFirst(vec3<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..ac07fe8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint3 subgroupBroadcastFirst_5e5b6f() {
+ uint3 res = WaveReadLaneFirst((1u).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, subgroupBroadcastFirst_5e5b6f());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, subgroupBroadcastFirst_5e5b6f());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..afa8946
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device uint3* prevent_dce;
+};
+
+uint3 subgroupBroadcastFirst_5e5b6f() {
+ uint3 res = simd_broadcast_first(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) = subgroupBroadcastFirst_5e5b6f();
+}
+
+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) = subgroupBroadcastFirst_5e5b6f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..852b055
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_5e5b6f "subgroupBroadcastFirst_5e5b6f"
+ 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
+%subgroupBroadcastFirst_5e5b6f = OpFunction %v3uint None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v3uint Function
+ %9 = OpGroupNonUniformBroadcastFirst %v3uint %uint_3 %11
+ OpStore %res %9
+ %15 = OpLoad %v3uint %res
+ OpReturnValue %15
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+ %19 = OpLabel
+ %20 = OpFunctionCall %v3uint %subgroupBroadcastFirst_5e5b6f
+ %21 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+ OpStore %21 %20
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %18
+ %25 = OpLabel
+ %26 = OpFunctionCall %v3uint %subgroupBroadcastFirst_5e5b6f
+ %27 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+ OpStore %27 %26
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.msl
new file mode 100644
index 0000000..0a44f38
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint3 subgroupBroadcastFirst_5e5b6f() {
+ uint3 res = simd_broadcast_first(uint3(1u));
+ return res;
+}
+
+fragment void fragment_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = packed_uint3(subgroupBroadcastFirst_5e5b6f());
+ return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = packed_uint3(subgroupBroadcastFirst_5e5b6f());
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.spvasm
new file mode 100644
index 0000000..597082c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupBroadcastFirst_5e5b6f() -> vec3<u32> {
+ var res : vec3<u32> = subgroupBroadcastFirst(vec3<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.wgsl
new file mode 100644
index 0000000..9d48b37
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/5e5b6f.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupBroadcastFirst_5e5b6f() -> vec3<u32> {
+ var res : vec3<u32> = subgroupBroadcastFirst(vec3<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl
new file mode 100644
index 0000000..16666c6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.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 subgroupBroadcastFirst(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupBroadcastFirst_612d6f() -> vec4<u32>{
+ var res: vec4<u32> = subgroupBroadcastFirst(vec4<u32>(1u));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3c6a125
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupBroadcastFirst_612d6f() {
+ uint4 res = WaveReadLaneFirst((1u).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_612d6f()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_612d6f()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3368404
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupBroadcastFirst_612d6f() {
+ uint4 res = WaveReadLaneFirst((1u).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_612d6f()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_612d6f()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.glsl
new file mode 100644
index 0000000..5964017
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupBroadcastFirst_612d6f() -> vec4<u32> {
+ var res : vec4<u32> = subgroupBroadcastFirst(vec4<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupBroadcastFirst_612d6f() -> vec4<u32> {
+ var res : vec4<u32> = subgroupBroadcastFirst(vec4<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..6d3757d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint4 subgroupBroadcastFirst_612d6f() {
+ uint4 res = WaveReadLaneFirst((1u).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, subgroupBroadcastFirst_612d6f());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, subgroupBroadcastFirst_612d6f());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..b6d0f44
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device uint4* prevent_dce;
+};
+
+uint4 subgroupBroadcastFirst_612d6f() {
+ uint4 res = simd_broadcast_first(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) = subgroupBroadcastFirst_612d6f();
+}
+
+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) = subgroupBroadcastFirst_612d6f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..057cb2d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_612d6f "subgroupBroadcastFirst_612d6f"
+ 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
+%subgroupBroadcastFirst_612d6f = OpFunction %v4uint None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v4uint Function
+ %9 = OpGroupNonUniformBroadcastFirst %v4uint %uint_3 %11
+ OpStore %res %9
+ %15 = OpLoad %v4uint %res
+ OpReturnValue %15
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+ %19 = OpLabel
+ %20 = OpFunctionCall %v4uint %subgroupBroadcastFirst_612d6f
+ %21 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+ OpStore %21 %20
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %18
+ %25 = OpLabel
+ %26 = OpFunctionCall %v4uint %subgroupBroadcastFirst_612d6f
+ %27 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+ OpStore %27 %26
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.msl
new file mode 100644
index 0000000..ea6ce52
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint4 subgroupBroadcastFirst_612d6f() {
+ uint4 res = simd_broadcast_first(uint4(1u));
+ return res;
+}
+
+fragment void fragment_main(device uint4* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_612d6f();
+ return;
+}
+
+kernel void compute_main(device uint4* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_612d6f();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.spvasm
new file mode 100644
index 0000000..e55f830
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupBroadcastFirst_612d6f() -> vec4<u32> {
+ var res : vec4<u32> = subgroupBroadcastFirst(vec4<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.wgsl
new file mode 100644
index 0000000..e15315b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/612d6f.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupBroadcastFirst_612d6f() -> vec4<u32> {
+ var res : vec4<u32> = subgroupBroadcastFirst(vec4<u32>(1u));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl
new file mode 100644
index 0000000..3bf5ff4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.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 subgroupBroadcastFirst(value: u32) -> u32
+fn subgroupBroadcastFirst_61f177() -> u32{
+ var res: u32 = subgroupBroadcastFirst(1u);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a8040b9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupBroadcastFirst_61f177() {
+ uint res = WaveReadLaneFirst(1u);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_61f177()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_61f177()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..f006149
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupBroadcastFirst_61f177() {
+ uint res = WaveReadLaneFirst(1u);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_61f177()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_61f177()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.glsl
new file mode 100644
index 0000000..abaff2e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupBroadcastFirst_61f177() -> u32 {
+ var res : u32 = subgroupBroadcastFirst(1u);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupBroadcastFirst_61f177() -> u32 {
+ var res : u32 = subgroupBroadcastFirst(1u);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..15a4f8f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint subgroupBroadcastFirst_61f177() {
+ uint res = WaveReadLaneFirst(1u);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, subgroupBroadcastFirst_61f177());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, subgroupBroadcastFirst_61f177());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.ir.msl
new file mode 100644
index 0000000..a16244b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device uint* prevent_dce;
+};
+
+uint subgroupBroadcastFirst_61f177() {
+ uint res = simd_broadcast_first(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) = subgroupBroadcastFirst_61f177();
+}
+
+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) = subgroupBroadcastFirst_61f177();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..493cb17
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_61f177 "subgroupBroadcastFirst_61f177"
+ 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
+%subgroupBroadcastFirst_61f177 = OpFunction %uint None %6
+ %7 = OpLabel
+ %res = OpVariable %_ptr_Function_uint Function
+ %8 = OpGroupNonUniformBroadcastFirst %uint %uint_3 %uint_1
+ OpStore %res %8
+ %13 = OpLoad %uint %res
+ OpReturnValue %13
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %16
+ %17 = OpLabel
+ %18 = OpFunctionCall %uint %subgroupBroadcastFirst_61f177
+ %19 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ OpStore %19 %18
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %16
+ %23 = OpLabel
+ %24 = OpFunctionCall %uint %subgroupBroadcastFirst_61f177
+ %25 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ OpStore %25 %24
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.msl
new file mode 100644
index 0000000..e6a5283
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint subgroupBroadcastFirst_61f177() {
+ uint res = simd_broadcast_first(1u);
+ return res;
+}
+
+fragment void fragment_main(device uint* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_61f177();
+ return;
+}
+
+kernel void compute_main(device uint* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_61f177();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.spvasm
new file mode 100644
index 0000000..5dea955
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupBroadcastFirst_61f177() -> u32 {
+ var res : u32 = subgroupBroadcastFirst(1u);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.wgsl
new file mode 100644
index 0000000..8cbadfc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/61f177.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupBroadcastFirst_61f177() -> u32 {
+ var res : u32 = subgroupBroadcastFirst(1u);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl
new file mode 100644
index 0000000..b718dcc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.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<f32>;
+
+
+// fn subgroupBroadcastFirst(value: vec<2, f32>) -> vec<2, f32>
+fn subgroupBroadcastFirst_6945f6() -> vec2<f32>{
+ var res: vec2<f32> = subgroupBroadcastFirst(vec2<f32>(1.f));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..11a471d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float2 subgroupBroadcastFirst_6945f6() {
+ float2 res = WaveReadLaneFirst((1.0f).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..b05b904
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float2 subgroupBroadcastFirst_6945f6() {
+ float2 res = WaveReadLaneFirst((1.0f).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.glsl
new file mode 100644
index 0000000..c999f9a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+fn subgroupBroadcastFirst_6945f6() -> vec2<f32> {
+ var res : vec2<f32> = subgroupBroadcastFirst(vec2<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+fn subgroupBroadcastFirst_6945f6() -> vec2<f32> {
+ var res : vec2<f32> = subgroupBroadcastFirst(vec2<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..59fb892
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+float2 subgroupBroadcastFirst_6945f6() {
+ float2 res = WaveReadLaneFirst((1.0f).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.msl
new file mode 100644
index 0000000..c02d095
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device float2* prevent_dce;
+};
+
+float2 subgroupBroadcastFirst_6945f6() {
+ float2 res = simd_broadcast_first(float2(1.0f));
+ 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) = subgroupBroadcastFirst_6945f6();
+}
+
+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) = subgroupBroadcastFirst_6945f6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..e78f85a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_6945f6 "subgroupBroadcastFirst_6945f6"
+ 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
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%tint_symbol_1 = OpTypeStruct %v2float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v2float
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v2float %float_1 %float_1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %void = OpTypeVoid
+ %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_6945f6 = OpFunction %v2float None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v2float Function
+ %9 = OpGroupNonUniformBroadcastFirst %v2float %uint_3 %12
+ OpStore %res %9
+ %16 = OpLoad %v2float %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %v2float %subgroupBroadcastFirst_6945f6
+ %22 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %v2float %subgroupBroadcastFirst_6945f6
+ %28 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.msl
new file mode 100644
index 0000000..827f79f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+float2 subgroupBroadcastFirst_6945f6() {
+ float2 res = simd_broadcast_first(float2(1.0f));
+ return res;
+}
+
+fragment void fragment_main(device float2* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_6945f6();
+ return;
+}
+
+kernel void compute_main(device float2* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_6945f6();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.spvasm
new file mode 100644
index 0000000..c3f5a80
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+fn subgroupBroadcastFirst_6945f6() -> vec2<f32> {
+ var res : vec2<f32> = subgroupBroadcastFirst(vec2<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.wgsl
new file mode 100644
index 0000000..cc837e9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/6945f6.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+fn subgroupBroadcastFirst_6945f6() -> vec2<f32> {
+ var res : vec2<f32> = subgroupBroadcastFirst(vec2<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl
new file mode 100644
index 0000000..1d60764
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl
@@ -0,0 +1,62 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+// test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+
+// fn subgroupBroadcastFirst(value: vec<4, f16>) -> vec<4, f16>
+fn subgroupBroadcastFirst_705aad() -> vec4<f16>{
+ var res: vec4<f16> = subgroupBroadcastFirst(vec4<f16>(1.h));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2f7af32
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 4> subgroupBroadcastFirst_705aad() {
+ vector<float16_t, 4> res = WaveReadLaneFirst((float16_t(1.0h)).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6eb74ed
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 4> subgroupBroadcastFirst_705aad() {
+ vector<float16_t, 4> res = WaveReadLaneFirst((float16_t(1.0h)).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.glsl
new file mode 100644
index 0000000..6ebba7a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.glsl
@@ -0,0 +1,54 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+fn subgroupBroadcastFirst_705aad() -> vec4<f16> {
+ var res : vec4<f16> = subgroupBroadcastFirst(vec4<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+fn subgroupBroadcastFirst_705aad() -> vec4<f16> {
+ var res : vec4<f16> = subgroupBroadcastFirst(vec4<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..0cca99b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+vector<float16_t, 4> subgroupBroadcastFirst_705aad() {
+ vector<float16_t, 4> res = WaveReadLaneFirst((float16_t(1.0h)).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.ir.msl
new file mode 100644
index 0000000..aa3db8b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device half4* prevent_dce;
+};
+
+half4 subgroupBroadcastFirst_705aad() {
+ half4 res = simd_broadcast_first(half4(1.0h));
+ 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) = subgroupBroadcastFirst_705aad();
+}
+
+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) = subgroupBroadcastFirst_705aad();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b37813f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+ OpCapability Shader
+ OpCapability Float16
+ OpCapability UniformAndStorageBuffer16BitAccess
+ OpCapability StorageBuffer16BitAccess
+ OpCapability GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_705aad "subgroupBroadcastFirst_705aad"
+ 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
+ %half = OpTypeFloat 16
+ %v4half = OpTypeVector %half 4
+%tint_symbol_1 = OpTypeStruct %v4half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v4half
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+ %12 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v4half = OpTypePointer Function %v4half
+ %void = OpTypeVoid
+ %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4half = OpTypePointer StorageBuffer %v4half
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_705aad = OpFunction %v4half None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v4half Function
+ %9 = OpGroupNonUniformBroadcastFirst %v4half %uint_3 %12
+ OpStore %res %9
+ %16 = OpLoad %v4half %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %v4half %subgroupBroadcastFirst_705aad
+ %22 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %v4half %subgroupBroadcastFirst_705aad
+ %28 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.msl
new file mode 100644
index 0000000..92bdafa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+half4 subgroupBroadcastFirst_705aad() {
+ half4 res = simd_broadcast_first(half4(1.0h));
+ return res;
+}
+
+fragment void fragment_main(device half4* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_705aad();
+ return;
+}
+
+kernel void compute_main(device half4* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_705aad();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.spvasm
new file mode 100644
index 0000000..bf69126
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+fn subgroupBroadcastFirst_705aad() -> vec4<f16> {
+ var res : vec4<f16> = subgroupBroadcastFirst(vec4<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.wgsl
new file mode 100644
index 0000000..1046619
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/705aad.wgsl.expected.wgsl
@@ -0,0 +1,20 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+fn subgroupBroadcastFirst_705aad() -> vec4<f16> {
+ var res : vec4<f16> = subgroupBroadcastFirst(vec4<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl
new file mode 100644
index 0000000..3055ec8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.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 subgroupBroadcastFirst(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupBroadcastFirst_85b351() -> vec2<i32>{
+ var res: vec2<i32> = subgroupBroadcastFirst(vec2<i32>(1i));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9d6ecb0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupBroadcastFirst_85b351() {
+ int2 res = WaveReadLaneFirst((1).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e5f1b49
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupBroadcastFirst_85b351() {
+ int2 res = WaveReadLaneFirst((1).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.glsl
new file mode 100644
index 0000000..8380f4e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupBroadcastFirst_85b351() -> vec2<i32> {
+ var res : vec2<i32> = subgroupBroadcastFirst(vec2<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupBroadcastFirst_85b351() -> vec2<i32> {
+ var res : vec2<i32> = subgroupBroadcastFirst(vec2<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..c1b0299
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int2 subgroupBroadcastFirst_85b351() {
+ int2 res = WaveReadLaneFirst((1).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.ir.msl
new file mode 100644
index 0000000..5a0b20b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device int2* prevent_dce;
+};
+
+int2 subgroupBroadcastFirst_85b351() {
+ int2 res = simd_broadcast_first(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) = subgroupBroadcastFirst_85b351();
+}
+
+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) = subgroupBroadcastFirst_85b351();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..809015b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_85b351 "subgroupBroadcastFirst_85b351"
+ 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
+%subgroupBroadcastFirst_85b351 = OpFunction %v2int None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v2int Function
+ %9 = OpGroupNonUniformBroadcastFirst %v2int %uint_3 %12
+ OpStore %res %9
+ %16 = OpLoad %v2int %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %v2int %subgroupBroadcastFirst_85b351
+ %22 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %v2int %subgroupBroadcastFirst_85b351
+ %28 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.msl
new file mode 100644
index 0000000..31a7c93
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int2 subgroupBroadcastFirst_85b351() {
+ int2 res = simd_broadcast_first(int2(1));
+ return res;
+}
+
+fragment void fragment_main(device int2* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_85b351();
+ return;
+}
+
+kernel void compute_main(device int2* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_85b351();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.spvasm
new file mode 100644
index 0000000..487e6ed
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupBroadcastFirst_85b351() -> vec2<i32> {
+ var res : vec2<i32> = subgroupBroadcastFirst(vec2<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.wgsl
new file mode 100644
index 0000000..76b1e69
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/85b351.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupBroadcastFirst_85b351() -> vec2<i32> {
+ var res : vec2<i32> = subgroupBroadcastFirst(vec2<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl
new file mode 100644
index 0000000..ddd2565
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.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<f32>;
+
+
+// fn subgroupBroadcastFirst(value: vec<4, f32>) -> vec<4, f32>
+fn subgroupBroadcastFirst_8ae580() -> vec4<f32>{
+ var res: vec4<f32> = subgroupBroadcastFirst(vec4<f32>(1.f));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..89be991
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float4 subgroupBroadcastFirst_8ae580() {
+ float4 res = WaveReadLaneFirst((1.0f).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2b17579
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float4 subgroupBroadcastFirst_8ae580() {
+ float4 res = WaveReadLaneFirst((1.0f).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.glsl
new file mode 100644
index 0000000..0e49f28
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+fn subgroupBroadcastFirst_8ae580() -> vec4<f32> {
+ var res : vec4<f32> = subgroupBroadcastFirst(vec4<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+fn subgroupBroadcastFirst_8ae580() -> vec4<f32> {
+ var res : vec4<f32> = subgroupBroadcastFirst(vec4<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..7f7a535
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+float4 subgroupBroadcastFirst_8ae580() {
+ float4 res = WaveReadLaneFirst((1.0f).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.msl
new file mode 100644
index 0000000..2cad1ce
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device float4* prevent_dce;
+};
+
+float4 subgroupBroadcastFirst_8ae580() {
+ float4 res = simd_broadcast_first(float4(1.0f));
+ 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) = subgroupBroadcastFirst_8ae580();
+}
+
+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) = subgroupBroadcastFirst_8ae580();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..4700974
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_8ae580 "subgroupBroadcastFirst_8ae580"
+ 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
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%tint_symbol_1 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v4float
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %void = OpTypeVoid
+ %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_8ae580 = OpFunction %v4float None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v4float Function
+ %9 = OpGroupNonUniformBroadcastFirst %v4float %uint_3 %12
+ OpStore %res %9
+ %16 = OpLoad %v4float %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %v4float %subgroupBroadcastFirst_8ae580
+ %22 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %v4float %subgroupBroadcastFirst_8ae580
+ %28 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.msl
new file mode 100644
index 0000000..b960681
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+float4 subgroupBroadcastFirst_8ae580() {
+ float4 res = simd_broadcast_first(float4(1.0f));
+ return res;
+}
+
+fragment void fragment_main(device float4* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_8ae580();
+ return;
+}
+
+kernel void compute_main(device float4* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_8ae580();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.spvasm
new file mode 100644
index 0000000..dad71be
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+fn subgroupBroadcastFirst_8ae580() -> vec4<f32> {
+ var res : vec4<f32> = subgroupBroadcastFirst(vec4<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.wgsl
new file mode 100644
index 0000000..b75b418
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/8ae580.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+fn subgroupBroadcastFirst_8ae580() -> vec4<f32> {
+ var res : vec4<f32> = subgroupBroadcastFirst(vec4<f32>(1.0f));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl
new file mode 100644
index 0000000..09e21b9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.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 subgroupBroadcastFirst(value: i32) -> i32
+fn subgroupBroadcastFirst_9a1bdc() -> i32{
+ var res: i32 = subgroupBroadcastFirst(1i);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a24b92b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupBroadcastFirst_9a1bdc() {
+ int res = WaveReadLaneFirst(1);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..43eecbd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupBroadcastFirst_9a1bdc() {
+ int res = WaveReadLaneFirst(1);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.glsl
new file mode 100644
index 0000000..e1ab265
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupBroadcastFirst_9a1bdc() -> i32 {
+ var res : i32 = subgroupBroadcastFirst(1i);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupBroadcastFirst_9a1bdc() -> i32 {
+ var res : i32 = subgroupBroadcastFirst(1i);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..6b5744b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int subgroupBroadcastFirst_9a1bdc() {
+ int res = WaveReadLaneFirst(1);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.msl
new file mode 100644
index 0000000..c22bc07
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device int* prevent_dce;
+};
+
+int subgroupBroadcastFirst_9a1bdc() {
+ int res = simd_broadcast_first(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) = subgroupBroadcastFirst_9a1bdc();
+}
+
+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) = subgroupBroadcastFirst_9a1bdc();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..587df0d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_9a1bdc "subgroupBroadcastFirst_9a1bdc"
+ 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
+%subgroupBroadcastFirst_9a1bdc = OpFunction %int None %6
+ %7 = OpLabel
+ %res = OpVariable %_ptr_Function_int Function
+ %8 = OpGroupNonUniformBroadcastFirst %int %uint_3 %int_1
+ OpStore %res %8
+ %14 = OpLoad %int %res
+ OpReturnValue %14
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %17
+ %18 = OpLabel
+ %19 = OpFunctionCall %int %subgroupBroadcastFirst_9a1bdc
+ %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+ OpStore %20 %19
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %17
+ %24 = OpLabel
+ %25 = OpFunctionCall %int %subgroupBroadcastFirst_9a1bdc
+ %26 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+ OpStore %26 %25
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.msl
new file mode 100644
index 0000000..ce83402
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int subgroupBroadcastFirst_9a1bdc() {
+ int res = simd_broadcast_first(1);
+ return res;
+}
+
+fragment void fragment_main(device int* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_9a1bdc();
+ return;
+}
+
+kernel void compute_main(device int* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_9a1bdc();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.spvasm
new file mode 100644
index 0000000..3a3675b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupBroadcastFirst_9a1bdc() -> i32 {
+ var res : i32 = subgroupBroadcastFirst(1i);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.wgsl
new file mode 100644
index 0000000..74db878
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9a1bdc.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupBroadcastFirst_9a1bdc() -> i32 {
+ var res : i32 = subgroupBroadcastFirst(1i);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl
new file mode 100644
index 0000000..1288b82
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.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 subgroupBroadcastFirst(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupBroadcastFirst_9dccee() -> vec4<i32>{
+ var res: vec4<i32> = subgroupBroadcastFirst(vec4<i32>(1i));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2edf42a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupBroadcastFirst_9dccee() {
+ int4 res = WaveReadLaneFirst((1).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6700345
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupBroadcastFirst_9dccee() {
+ int4 res = WaveReadLaneFirst((1).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.glsl
new file mode 100644
index 0000000..6e459af
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupBroadcastFirst_9dccee() -> vec4<i32> {
+ var res : vec4<i32> = subgroupBroadcastFirst(vec4<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupBroadcastFirst_9dccee() -> vec4<i32> {
+ var res : vec4<i32> = subgroupBroadcastFirst(vec4<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..f4b74cb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int4 subgroupBroadcastFirst_9dccee() {
+ int4 res = WaveReadLaneFirst((1).xxxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.msl
new file mode 100644
index 0000000..b582cb0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device int4* prevent_dce;
+};
+
+int4 subgroupBroadcastFirst_9dccee() {
+ int4 res = simd_broadcast_first(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) = subgroupBroadcastFirst_9dccee();
+}
+
+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) = subgroupBroadcastFirst_9dccee();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..d1d00c2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_9dccee "subgroupBroadcastFirst_9dccee"
+ 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
+%subgroupBroadcastFirst_9dccee = OpFunction %v4int None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v4int Function
+ %9 = OpGroupNonUniformBroadcastFirst %v4int %uint_3 %12
+ OpStore %res %9
+ %16 = OpLoad %v4int %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %v4int %subgroupBroadcastFirst_9dccee
+ %22 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %v4int %subgroupBroadcastFirst_9dccee
+ %28 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.msl
new file mode 100644
index 0000000..0b75cfd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int4 subgroupBroadcastFirst_9dccee() {
+ int4 res = simd_broadcast_first(int4(1));
+ return res;
+}
+
+fragment void fragment_main(device int4* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_9dccee();
+ return;
+}
+
+kernel void compute_main(device int4* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_9dccee();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.spvasm
new file mode 100644
index 0000000..4e97165
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupBroadcastFirst_9dccee() -> vec4<i32> {
+ var res : vec4<i32> = subgroupBroadcastFirst(vec4<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.wgsl
new file mode 100644
index 0000000..4220665
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/9dccee.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupBroadcastFirst_9dccee() -> vec4<i32> {
+ var res : vec4<i32> = subgroupBroadcastFirst(vec4<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl
new file mode 100644
index 0000000..fd0ae2e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl
@@ -0,0 +1,62 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+// test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+
+// fn subgroupBroadcastFirst(value: vec<2, f16>) -> vec<2, f16>
+fn subgroupBroadcastFirst_a11307() -> vec2<f16>{
+ var res: vec2<f16> = subgroupBroadcastFirst(vec2<f16>(1.h));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..33e18f0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 2> subgroupBroadcastFirst_a11307() {
+ vector<float16_t, 2> res = WaveReadLaneFirst((float16_t(1.0h)).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d503b57
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 2> subgroupBroadcastFirst_a11307() {
+ vector<float16_t, 2> res = WaveReadLaneFirst((float16_t(1.0h)).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.glsl
new file mode 100644
index 0000000..5b192db
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.glsl
@@ -0,0 +1,54 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+fn subgroupBroadcastFirst_a11307() -> vec2<f16> {
+ var res : vec2<f16> = subgroupBroadcastFirst(vec2<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+fn subgroupBroadcastFirst_a11307() -> vec2<f16> {
+ var res : vec2<f16> = subgroupBroadcastFirst(vec2<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..f069797
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+vector<float16_t, 2> subgroupBroadcastFirst_a11307() {
+ vector<float16_t, 2> res = WaveReadLaneFirst((float16_t(1.0h)).xx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.ir.msl
new file mode 100644
index 0000000..7eda83e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device half2* prevent_dce;
+};
+
+half2 subgroupBroadcastFirst_a11307() {
+ half2 res = simd_broadcast_first(half2(1.0h));
+ 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) = subgroupBroadcastFirst_a11307();
+}
+
+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) = subgroupBroadcastFirst_a11307();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2e17f28
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.ir.spvasm
@@ -0,0 +1,62 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+ OpCapability Shader
+ OpCapability Float16
+ OpCapability UniformAndStorageBuffer16BitAccess
+ OpCapability StorageBuffer16BitAccess
+ OpCapability GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_a11307 "subgroupBroadcastFirst_a11307"
+ 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
+ %half = OpTypeFloat 16
+ %v2half = OpTypeVector %half 2
+%tint_symbol_1 = OpTypeStruct %v2half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v2half
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+ %12 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v2half = OpTypePointer Function %v2half
+ %void = OpTypeVoid
+ %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2half = OpTypePointer StorageBuffer %v2half
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_a11307 = OpFunction %v2half None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v2half Function
+ %9 = OpGroupNonUniformBroadcastFirst %v2half %uint_3 %12
+ OpStore %res %9
+ %16 = OpLoad %v2half %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %v2half %subgroupBroadcastFirst_a11307
+ %22 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %v2half %subgroupBroadcastFirst_a11307
+ %28 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.msl
new file mode 100644
index 0000000..dcdac7b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+half2 subgroupBroadcastFirst_a11307() {
+ half2 res = simd_broadcast_first(half2(1.0h));
+ return res;
+}
+
+fragment void fragment_main(device half2* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_a11307();
+ return;
+}
+
+kernel void compute_main(device half2* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_a11307();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.spvasm
new file mode 100644
index 0000000..4ac868a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.spvasm
@@ -0,0 +1,25 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+fn subgroupBroadcastFirst_a11307() -> vec2<f16> {
+ var res : vec2<f16> = subgroupBroadcastFirst(vec2<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.wgsl
new file mode 100644
index 0000000..3d65d8a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/a11307.wgsl.expected.wgsl
@@ -0,0 +1,20 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+fn subgroupBroadcastFirst_a11307() -> vec2<f16> {
+ var res : vec2<f16> = subgroupBroadcastFirst(vec2<f16>(1.0h));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl
new file mode 100644
index 0000000..91e86ce
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.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 subgroupBroadcastFirst(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupBroadcastFirst_e820d4() -> vec3<i32>{
+ var res: vec3<i32> = subgroupBroadcastFirst(vec3<i32>(1i));
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8df5067
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupBroadcastFirst_e820d4() {
+ int3 res = WaveReadLaneFirst((1).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..af52b29
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupBroadcastFirst_e820d4() {
+ int3 res = WaveReadLaneFirst((1).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.glsl
new file mode 100644
index 0000000..ef77ac3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupBroadcastFirst_e820d4() -> vec3<i32> {
+ var res : vec3<i32> = subgroupBroadcastFirst(vec3<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupBroadcastFirst_e820d4() -> vec3<i32> {
+ var res : vec3<i32> = subgroupBroadcastFirst(vec3<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..3602003
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,16 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int3 subgroupBroadcastFirst_e820d4() {
+ int3 res = WaveReadLaneFirst((1).xxx);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.msl
new file mode 100644
index 0000000..5aa1477
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device int3* prevent_dce;
+};
+
+int3 subgroupBroadcastFirst_e820d4() {
+ int3 res = simd_broadcast_first(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) = subgroupBroadcastFirst_e820d4();
+}
+
+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) = subgroupBroadcastFirst_e820d4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b95eed9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_e820d4 "subgroupBroadcastFirst_e820d4"
+ 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
+%subgroupBroadcastFirst_e820d4 = OpFunction %v3int None %7
+ %8 = OpLabel
+ %res = OpVariable %_ptr_Function_v3int Function
+ %9 = OpGroupNonUniformBroadcastFirst %v3int %uint_3 %12
+ OpStore %res %9
+ %16 = OpLoad %v3int %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %v3int %subgroupBroadcastFirst_e820d4
+ %22 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %v3int %subgroupBroadcastFirst_e820d4
+ %28 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.msl
new file mode 100644
index 0000000..f219345
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int3 subgroupBroadcastFirst_e820d4() {
+ int3 res = simd_broadcast_first(int3(1));
+ return res;
+}
+
+fragment void fragment_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = packed_int3(subgroupBroadcastFirst_e820d4());
+ return;
+}
+
+kernel void compute_main(device packed_int3* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = packed_int3(subgroupBroadcastFirst_e820d4());
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.spvasm
new file mode 100644
index 0000000..ce1b36e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupBroadcastFirst_e820d4() -> vec3<i32> {
+ var res : vec3<i32> = subgroupBroadcastFirst(vec3<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.wgsl
new file mode 100644
index 0000000..ece87f5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupBroadcastFirst/e820d4.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupBroadcastFirst_e820d4() -> vec3<i32> {
+ var res : vec3<i32> = subgroupBroadcastFirst(vec3<i32>(1i));
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl
new file mode 100644
index 0000000..bd112d5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupElect/3943d6.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 subgroupElect() -> bool
+fn subgroupElect_3943d6() -> i32{
+ var res: bool = subgroupElect();
+ return select(0, 1, all(res == bool()));
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..23a9b78
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupElect_3943d6() {
+ bool res = WaveIsFirstLane();
+ return (all((res == false)) ? 1 : 0);
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupElect_3943d6()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupElect_3943d6()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c05cc9d5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupElect_3943d6() {
+ bool res = WaveIsFirstLane();
+ return (all((res == false)) ? 1 : 0);
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupElect_3943d6()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupElect_3943d6()));
+ return;
+}
diff --git a/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.glsl
new file mode 100644
index 0000000..2a39365
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupElect_3943d6() -> i32 {
+ var res : bool = subgroupElect();
+ return select(0, 1, all((res == bool())));
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupElect_3943d6() -> i32 {
+ var res : bool = subgroupElect();
+ return select(0, 1, all((res == bool())));
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.msl
new file mode 100644
index 0000000..79f7031
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int subgroupElect_3943d6() {
+ bool res = simd_is_first();
+ return select(0, 1, all((res == false)));
+}
+
+fragment void fragment_main(device int* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupElect_3943d6();
+ return;
+}
+
+kernel void compute_main(device int* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupElect_3943d6();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.spvasm
new file mode 100644
index 0000000..170103b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupElect_3943d6() -> i32 {
+ var res : bool = subgroupElect();
+ return select(0, 1, all((res == bool())));
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.wgsl
new file mode 100644
index 0000000..0564231
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupElect/3943d6.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupElect_3943d6() -> i32 {
+ var res : bool = subgroupElect();
+ return select(0, 1, all((res == bool())));
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.ir.msl
index a4963e5..113aadc 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/07e2d8.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device half* prevent_dce;
+};
+
+half subgroupBroadcast_07e2d8() {
+ half arg_0 = 1.0h;
+ half res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_07e2d8();
+}
+
+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) = subgroupBroadcast_07e2d8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.ir.msl
index a4963e5..f43fa60 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/08beca.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device float* prevent_dce;
+};
+
+float subgroupBroadcast_08beca() {
+ float arg_0 = 1.0f;
+ float res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_08beca();
+}
+
+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) = subgroupBroadcast_08beca();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.ir.msl
index a4963e5..7ee4e16 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/0f44e2.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device half4* prevent_dce;
+};
+
+half4 subgroupBroadcast_0f44e2() {
+ half4 arg_0 = half4(1.0h);
+ half4 res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_0f44e2();
+}
+
+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) = subgroupBroadcast_0f44e2();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.ir.msl
index a4963e5..0e5e96a 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/13f36c.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device half2* prevent_dce;
+};
+
+half2 subgroupBroadcast_13f36c() {
+ half2 arg_0 = half2(1.0h);
+ half2 res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_13f36c();
+}
+
+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) = subgroupBroadcast_13f36c();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.ir.msl
index a4963e5..83d947b 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/1d79c7.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device int* prevent_dce;
+};
+
+int subgroupBroadcast_1d79c7() {
+ int arg_0 = 1;
+ int res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_1d79c7();
+}
+
+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) = subgroupBroadcast_1d79c7();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.ir.msl
index a4963e5..d64c3af 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/279027.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device uint4* prevent_dce;
+};
+
+uint4 subgroupBroadcast_279027() {
+ uint4 arg_0 = uint4(1u);
+ uint4 res = simd_broadcast(arg_0, 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) = subgroupBroadcast_279027();
+}
+
+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) = subgroupBroadcast_279027();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.ir.msl
index a4963e5..240f1e4 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/34fa3d.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device uint3* prevent_dce;
+};
+
+uint3 subgroupBroadcast_34fa3d() {
+ uint3 arg_0 = uint3(1u);
+ uint3 res = simd_broadcast(arg_0, 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) = subgroupBroadcast_34fa3d();
+}
+
+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) = subgroupBroadcast_34fa3d();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.ir.msl
index a4963e5..11d7a8f 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/3e6879.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device int2* prevent_dce;
+};
+
+int2 subgroupBroadcast_3e6879() {
+ int2 arg_0 = int2(1);
+ int2 res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_3e6879();
+}
+
+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) = subgroupBroadcast_3e6879();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.ir.msl
index a4963e5..4039807 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/41e5d7.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device half3* prevent_dce;
+};
+
+half3 subgroupBroadcast_41e5d7() {
+ half3 arg_0 = half3(1.0h);
+ half3 res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_41e5d7();
+}
+
+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) = subgroupBroadcast_41e5d7();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.ir.msl
index a4963e5..b17a028 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/4a4334.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device uint2* prevent_dce;
+};
+
+uint2 subgroupBroadcast_4a4334() {
+ uint2 arg_0 = uint2(1u);
+ uint2 res = simd_broadcast(arg_0, 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) = subgroupBroadcast_4a4334();
+}
+
+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) = subgroupBroadcast_4a4334();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.ir.msl
index a4963e5..083a2ab 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/5196c8.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device float2* prevent_dce;
+};
+
+float2 subgroupBroadcast_5196c8() {
+ float2 arg_0 = float2(1.0f);
+ float2 res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_5196c8();
+}
+
+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) = subgroupBroadcast_5196c8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.ir.msl
index a4963e5..0b9ec87 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/912ff5.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device float3* prevent_dce;
+};
+
+float3 subgroupBroadcast_912ff5() {
+ float3 arg_0 = float3(1.0f);
+ float3 res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_912ff5();
+}
+
+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) = subgroupBroadcast_912ff5();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.ir.msl
index a4963e5..ced153e 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/b7e93b.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device float4* prevent_dce;
+};
+
+float4 subgroupBroadcast_b7e93b() {
+ float4 arg_0 = float4(1.0f);
+ float4 res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_b7e93b();
+}
+
+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) = subgroupBroadcast_b7e93b();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.ir.msl
index a4963e5..6b3f9dc 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/c36fe1.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device uint* prevent_dce;
+};
+
+uint subgroupBroadcast_c36fe1() {
+ uint arg_0 = 1u;
+ uint res = simd_broadcast(arg_0, 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) = subgroupBroadcast_c36fe1();
+}
+
+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) = subgroupBroadcast_c36fe1();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.ir.msl
index a4963e5..ac79826 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/e275c8.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device int3* prevent_dce;
+};
+
+int3 subgroupBroadcast_e275c8() {
+ int3 arg_0 = int3(1);
+ int3 res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_e275c8();
+}
+
+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) = subgroupBroadcast_e275c8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.ir.msl
index a4963e5..8a8396c 100644
--- a/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/subgroupBroadcast/f637f9.wgsl.expected.ir.msl
@@ -1,9 +1,22 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-../../src/tint/lang/msl/writer/printer/printer.cc:989 internal compiler error: TINT_UNREACHABLE unhandled: 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. *
-********************************************************************
+struct tint_module_vars_struct {
+ device int4* prevent_dce;
+};
+
+int4 subgroupBroadcast_f637f9() {
+ int4 arg_0 = int4(1);
+ int4 res = simd_broadcast(arg_0, 1u);
+ 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) = subgroupBroadcast_f637f9();
+}
+
+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) = subgroupBroadcast_f637f9();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl
new file mode 100644
index 0000000..3952948
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.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 : f32;
+
+
+// fn subgroupBroadcastFirst(value: f32) -> f32
+fn subgroupBroadcastFirst_0538e1() -> f32{
+ var arg_0 = 1.f;
+ var res: f32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..05f622a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float subgroupBroadcastFirst_0538e1() {
+ float arg_0 = 1.0f;
+ float res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..145d192
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float subgroupBroadcastFirst_0538e1() {
+ float arg_0 = 1.0f;
+ float res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.glsl
new file mode 100644
index 0000000..e82e6c5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupBroadcastFirst_0538e1() -> f32 {
+ var arg_0 = 1.0f;
+ var res : f32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupBroadcastFirst_0538e1() -> f32 {
+ var arg_0 = 1.0f;
+ var res : f32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..407e2ab
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+float subgroupBroadcastFirst_0538e1() {
+ float arg_0 = 1.0f;
+ float res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_0538e1()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.msl
new file mode 100644
index 0000000..2205604
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device float* prevent_dce;
+};
+
+float subgroupBroadcastFirst_0538e1() {
+ float arg_0 = 1.0f;
+ float res = simd_broadcast_first(arg_0);
+ 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) = subgroupBroadcastFirst_0538e1();
+}
+
+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) = subgroupBroadcastFirst_0538e1();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..63d286f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_0538e1 "subgroupBroadcastFirst_0538e1"
+ 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
+ %float = OpTypeFloat 32
+%tint_symbol_1 = OpTypeStruct %float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %6 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_1 = OpConstant %float 1
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %void = OpTypeVoid
+ %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_0538e1 = OpFunction %float None %6
+ %7 = OpLabel
+ %arg_0 = OpVariable %_ptr_Function_float Function
+ %res = OpVariable %_ptr_Function_float Function
+ OpStore %arg_0 %float_1
+ %11 = OpLoad %float %arg_0
+ %12 = OpGroupNonUniformBroadcastFirst %float %uint_3 %11
+ OpStore %res %12
+ %16 = OpLoad %float %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %float %subgroupBroadcastFirst_0538e1
+ %22 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %float %subgroupBroadcastFirst_0538e1
+ %28 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.msl
new file mode 100644
index 0000000..a59b298
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+float subgroupBroadcastFirst_0538e1() {
+ float arg_0 = 1.0f;
+ float res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device float* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_0538e1();
+ return;
+}
+
+kernel void compute_main(device float* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_0538e1();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.spvasm
new file mode 100644
index 0000000..7cd95c1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupBroadcastFirst_0538e1() -> f32 {
+ var arg_0 = 1.0f;
+ var res : f32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.wgsl
new file mode 100644
index 0000000..15fc4a8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0538e1.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupBroadcastFirst_0538e1() -> f32 {
+ var arg_0 = 1.0f;
+ var res : f32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0538e1();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl
new file mode 100644
index 0000000..8424c15
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl
@@ -0,0 +1,63 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+// test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+
+// fn subgroupBroadcastFirst(value: vec<3, f16>) -> vec<3, f16>
+fn subgroupBroadcastFirst_0e58ec() -> vec3<f16>{
+ var arg_0 = vec3<f16>(1.h);
+ var res: vec3<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..7894f2f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 3> subgroupBroadcastFirst_0e58ec() {
+ vector<float16_t, 3> arg_0 = (float16_t(1.0h)).xxx;
+ vector<float16_t, 3> res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..49a9e38
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 3> subgroupBroadcastFirst_0e58ec() {
+ vector<float16_t, 3> arg_0 = (float16_t(1.0h)).xxx;
+ vector<float16_t, 3> res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.glsl
new file mode 100644
index 0000000..34260dc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.glsl
@@ -0,0 +1,56 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+fn subgroupBroadcastFirst_0e58ec() -> vec3<f16> {
+ var arg_0 = vec3<f16>(1.0h);
+ var res : vec3<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+fn subgroupBroadcastFirst_0e58ec() -> vec3<f16> {
+ var arg_0 = vec3<f16>(1.0h);
+ var res : vec3<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..30422c9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+vector<float16_t, 3> subgroupBroadcastFirst_0e58ec() {
+ vector<float16_t, 3> arg_0 = (float16_t(1.0h)).xxx;
+ vector<float16_t, 3> res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 3> >(0u, subgroupBroadcastFirst_0e58ec());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.msl
new file mode 100644
index 0000000..8df2d9a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device half3* prevent_dce;
+};
+
+half3 subgroupBroadcastFirst_0e58ec() {
+ half3 arg_0 = half3(1.0h);
+ half3 res = simd_broadcast_first(arg_0);
+ 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) = subgroupBroadcastFirst_0e58ec();
+}
+
+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) = subgroupBroadcastFirst_0e58ec();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..4b4c2d1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.ir.spvasm
@@ -0,0 +1,66 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+ OpCapability Shader
+ OpCapability Float16
+ OpCapability UniformAndStorageBuffer16BitAccess
+ OpCapability StorageBuffer16BitAccess
+ OpCapability GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_0e58ec "subgroupBroadcastFirst_0e58ec"
+ 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
+ %half = OpTypeFloat 16
+ %v3half = OpTypeVector %half 3
+%tint_symbol_1 = OpTypeStruct %v3half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v3half
+%_ptr_Function_v3half = OpTypePointer Function %v3half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+ %11 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %void = OpTypeVoid
+ %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3half = OpTypePointer StorageBuffer %v3half
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_0e58ec = OpFunction %v3half None %7
+ %8 = OpLabel
+ %arg_0 = OpVariable %_ptr_Function_v3half Function
+ %res = OpVariable %_ptr_Function_v3half Function
+ OpStore %arg_0 %11
+ %13 = OpLoad %v3half %arg_0
+ %14 = OpGroupNonUniformBroadcastFirst %v3half %uint_3 %13
+ OpStore %res %14
+ %18 = OpLoad %v3half %res
+ OpReturnValue %18
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+ %22 = OpLabel
+ %23 = OpFunctionCall %v3half %subgroupBroadcastFirst_0e58ec
+ %24 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+ OpStore %24 %23
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %21
+ %28 = OpLabel
+ %29 = OpFunctionCall %v3half %subgroupBroadcastFirst_0e58ec
+ %30 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+ OpStore %30 %29
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.msl
new file mode 100644
index 0000000..6120f4e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+half3 subgroupBroadcastFirst_0e58ec() {
+ half3 arg_0 = half3(1.0h);
+ half3 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device packed_half3* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = packed_half3(subgroupBroadcastFirst_0e58ec());
+ return;
+}
+
+kernel void compute_main(device packed_half3* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = packed_half3(subgroupBroadcastFirst_0e58ec());
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.spvasm
new file mode 100644
index 0000000..7503ee5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+fn subgroupBroadcastFirst_0e58ec() -> vec3<f16> {
+ var arg_0 = vec3<f16>(1.0h);
+ var res : vec3<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.wgsl
new file mode 100644
index 0000000..d4a6074
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/0e58ec.wgsl.expected.wgsl
@@ -0,0 +1,21 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+fn subgroupBroadcastFirst_0e58ec() -> vec3<f16> {
+ var arg_0 = vec3<f16>(1.0h);
+ var res : vec3<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_0e58ec();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl
new file mode 100644
index 0000000..9ae7c17
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl
@@ -0,0 +1,63 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+// test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+
+// fn subgroupBroadcastFirst(value: f16) -> f16
+fn subgroupBroadcastFirst_151e52() -> f16{
+ var arg_0 = 1.h;
+ var res: f16 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..5b0fe72
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float16_t subgroupBroadcastFirst_151e52() {
+ float16_t arg_0 = float16_t(1.0h);
+ float16_t res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0378b88
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float16_t subgroupBroadcastFirst_151e52() {
+ float16_t arg_0 = float16_t(1.0h);
+ float16_t res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.glsl
new file mode 100644
index 0000000..93ca5e7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.glsl
@@ -0,0 +1,56 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupBroadcastFirst_151e52() -> f16 {
+ var arg_0 = 1.0h;
+ var res : f16 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupBroadcastFirst_151e52() -> f16 {
+ var arg_0 = 1.0h;
+ var res : f16 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..fc42b1a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+float16_t subgroupBroadcastFirst_151e52() {
+ float16_t arg_0 = float16_t(1.0h);
+ float16_t res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<float16_t>(0u, subgroupBroadcastFirst_151e52());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.ir.msl
new file mode 100644
index 0000000..4afe0ba
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device half* prevent_dce;
+};
+
+half subgroupBroadcastFirst_151e52() {
+ half arg_0 = 1.0h;
+ half res = simd_broadcast_first(arg_0);
+ 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) = subgroupBroadcastFirst_151e52();
+}
+
+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) = subgroupBroadcastFirst_151e52();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..26cec10
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.ir.spvasm
@@ -0,0 +1,64 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 29
+; Schema: 0
+ OpCapability Shader
+ OpCapability Float16
+ OpCapability UniformAndStorageBuffer16BitAccess
+ OpCapability StorageBuffer16BitAccess
+ OpCapability GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_151e52 "subgroupBroadcastFirst_151e52"
+ 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
+ %half = OpTypeFloat 16
+%tint_symbol_1 = OpTypeStruct %half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %6 = OpTypeFunction %half
+%_ptr_Function_half = OpTypePointer Function %half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %void = OpTypeVoid
+ %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_151e52 = OpFunction %half None %6
+ %7 = OpLabel
+ %arg_0 = OpVariable %_ptr_Function_half Function
+ %res = OpVariable %_ptr_Function_half Function
+ OpStore %arg_0 %half_0x1p_0
+ %11 = OpLoad %half %arg_0
+ %12 = OpGroupNonUniformBroadcastFirst %half %uint_3 %11
+ OpStore %res %12
+ %16 = OpLoad %half %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %half %subgroupBroadcastFirst_151e52
+ %22 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %half %subgroupBroadcastFirst_151e52
+ %28 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.msl
new file mode 100644
index 0000000..23c1291
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+half subgroupBroadcastFirst_151e52() {
+ half arg_0 = 1.0h;
+ half res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device half* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_151e52();
+ return;
+}
+
+kernel void compute_main(device half* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_151e52();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.spvasm
new file mode 100644
index 0000000..10fd6d0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupBroadcastFirst_151e52() -> f16 {
+ var arg_0 = 1.0h;
+ var res : f16 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.wgsl
new file mode 100644
index 0000000..77e091e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/151e52.wgsl.expected.wgsl
@@ -0,0 +1,21 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupBroadcastFirst_151e52() -> f16 {
+ var arg_0 = 1.0h;
+ var res : f16 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_151e52();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl
new file mode 100644
index 0000000..607ee1e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.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 subgroupBroadcastFirst(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupBroadcastFirst_1d9530() -> vec2<u32>{
+ var arg_0 = vec2<u32>(1u);
+ var res: vec2<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..171f17a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupBroadcastFirst_1d9530() {
+ uint2 arg_0 = (1u).xx;
+ uint2 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_1d9530()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_1d9530()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..868f07f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint2 subgroupBroadcastFirst_1d9530() {
+ uint2 arg_0 = (1u).xx;
+ uint2 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_1d9530()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_1d9530()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.glsl
new file mode 100644
index 0000000..1de06a6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupBroadcastFirst_1d9530() -> vec2<u32> {
+ var arg_0 = vec2<u32>(1u);
+ var res : vec2<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupBroadcastFirst_1d9530() -> vec2<u32> {
+ var arg_0 = vec2<u32>(1u);
+ var res : vec2<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..59f18af
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint2 subgroupBroadcastFirst_1d9530() {
+ uint2 arg_0 = (1u).xx;
+ uint2 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, subgroupBroadcastFirst_1d9530());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, subgroupBroadcastFirst_1d9530());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.msl
new file mode 100644
index 0000000..cc7c947
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device uint2* prevent_dce;
+};
+
+uint2 subgroupBroadcastFirst_1d9530() {
+ uint2 arg_0 = uint2(1u);
+ uint2 res = simd_broadcast_first(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) = subgroupBroadcastFirst_1d9530();
+}
+
+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) = subgroupBroadcastFirst_1d9530();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..776f312
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_1d9530 "subgroupBroadcastFirst_1d9530"
+ 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
+%subgroupBroadcastFirst_1d9530 = 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 = OpGroupNonUniformBroadcastFirst %v2uint %uint_3 %13
+ OpStore %res %14
+ %17 = OpLoad %v2uint %res
+ OpReturnValue %17
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+ %21 = OpLabel
+ %22 = OpFunctionCall %v2uint %subgroupBroadcastFirst_1d9530
+ %23 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+ OpStore %23 %22
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %20
+ %27 = OpLabel
+ %28 = OpFunctionCall %v2uint %subgroupBroadcastFirst_1d9530
+ %29 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+ OpStore %29 %28
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.msl
new file mode 100644
index 0000000..621913f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint2 subgroupBroadcastFirst_1d9530() {
+ uint2 arg_0 = uint2(1u);
+ uint2 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device uint2* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_1d9530();
+ return;
+}
+
+kernel void compute_main(device uint2* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_1d9530();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.spvasm
new file mode 100644
index 0000000..046a571
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupBroadcastFirst_1d9530() -> vec2<u32> {
+ var arg_0 = vec2<u32>(1u);
+ var res : vec2<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.wgsl
new file mode 100644
index 0000000..13700ea
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/1d9530.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+fn subgroupBroadcastFirst_1d9530() -> vec2<u32> {
+ var arg_0 = vec2<u32>(1u);
+ var res : vec2<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_1d9530();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl
new file mode 100644
index 0000000..ce5d13b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.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<f32>;
+
+
+// fn subgroupBroadcastFirst(value: vec<3, f32>) -> vec<3, f32>
+fn subgroupBroadcastFirst_5c6962() -> vec3<f32>{
+ var arg_0 = vec3<f32>(1.f);
+ var res: vec3<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cae2288
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float3 subgroupBroadcastFirst_5c6962() {
+ float3 arg_0 = (1.0f).xxx;
+ float3 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..fe8da5d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float3 subgroupBroadcastFirst_5c6962() {
+ float3 arg_0 = (1.0f).xxx;
+ float3 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.glsl
new file mode 100644
index 0000000..950e417
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+fn subgroupBroadcastFirst_5c6962() -> vec3<f32> {
+ var arg_0 = vec3<f32>(1.0f);
+ var res : vec3<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+fn subgroupBroadcastFirst_5c6962() -> vec3<f32> {
+ var arg_0 = vec3<f32>(1.0f);
+ var res : vec3<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..776b5cd
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+float3 subgroupBroadcastFirst_5c6962() {
+ float3 arg_0 = (1.0f).xxx;
+ float3 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5c6962()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.msl
new file mode 100644
index 0000000..51ba53a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device float3* prevent_dce;
+};
+
+float3 subgroupBroadcastFirst_5c6962() {
+ float3 arg_0 = float3(1.0f);
+ float3 res = simd_broadcast_first(arg_0);
+ 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) = subgroupBroadcastFirst_5c6962();
+}
+
+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) = subgroupBroadcastFirst_5c6962();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..eb795f6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_5c6962 "subgroupBroadcastFirst_5c6962"
+ 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
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%tint_symbol_1 = OpTypeStruct %v3float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v3float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %float_1 = OpConstant %float 1
+ %11 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %void = OpTypeVoid
+ %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_5c6962 = OpFunction %v3float None %7
+ %8 = OpLabel
+ %arg_0 = OpVariable %_ptr_Function_v3float Function
+ %res = OpVariable %_ptr_Function_v3float Function
+ OpStore %arg_0 %11
+ %13 = OpLoad %v3float %arg_0
+ %14 = OpGroupNonUniformBroadcastFirst %v3float %uint_3 %13
+ OpStore %res %14
+ %18 = OpLoad %v3float %res
+ OpReturnValue %18
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+ %22 = OpLabel
+ %23 = OpFunctionCall %v3float %subgroupBroadcastFirst_5c6962
+ %24 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+ OpStore %24 %23
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %21
+ %28 = OpLabel
+ %29 = OpFunctionCall %v3float %subgroupBroadcastFirst_5c6962
+ %30 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+ OpStore %30 %29
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.msl
new file mode 100644
index 0000000..6aa68cf
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+float3 subgroupBroadcastFirst_5c6962() {
+ float3 arg_0 = float3(1.0f);
+ float3 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device packed_float3* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = packed_float3(subgroupBroadcastFirst_5c6962());
+ return;
+}
+
+kernel void compute_main(device packed_float3* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = packed_float3(subgroupBroadcastFirst_5c6962());
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.spvasm
new file mode 100644
index 0000000..442fc29
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+fn subgroupBroadcastFirst_5c6962() -> vec3<f32> {
+ var arg_0 = vec3<f32>(1.0f);
+ var res : vec3<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.wgsl
new file mode 100644
index 0000000..df8242f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5c6962.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+fn subgroupBroadcastFirst_5c6962() -> vec3<f32> {
+ var arg_0 = vec3<f32>(1.0f);
+ var res : vec3<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5c6962();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl
new file mode 100644
index 0000000..540b011
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.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 subgroupBroadcastFirst(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupBroadcastFirst_5e5b6f() -> vec3<u32>{
+ var arg_0 = vec3<u32>(1u);
+ var res: vec3<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6124729
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupBroadcastFirst_5e5b6f() {
+ uint3 arg_0 = (1u).xxx;
+ uint3 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5e5b6f()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5e5b6f()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c7b949c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint3 subgroupBroadcastFirst_5e5b6f() {
+ uint3 arg_0 = (1u).xxx;
+ uint3 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5e5b6f()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_5e5b6f()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.glsl
new file mode 100644
index 0000000..f122624
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupBroadcastFirst_5e5b6f() -> vec3<u32> {
+ var arg_0 = vec3<u32>(1u);
+ var res : vec3<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupBroadcastFirst_5e5b6f() -> vec3<u32> {
+ var arg_0 = vec3<u32>(1u);
+ var res : vec3<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..5042ec8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint3 subgroupBroadcastFirst_5e5b6f() {
+ uint3 arg_0 = (1u).xxx;
+ uint3 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, subgroupBroadcastFirst_5e5b6f());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, subgroupBroadcastFirst_5e5b6f());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..3ffa247
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device uint3* prevent_dce;
+};
+
+uint3 subgroupBroadcastFirst_5e5b6f() {
+ uint3 arg_0 = uint3(1u);
+ uint3 res = simd_broadcast_first(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) = subgroupBroadcastFirst_5e5b6f();
+}
+
+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) = subgroupBroadcastFirst_5e5b6f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b10dc75
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_5e5b6f "subgroupBroadcastFirst_5e5b6f"
+ 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
+%subgroupBroadcastFirst_5e5b6f = 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 = OpGroupNonUniformBroadcastFirst %v3uint %uint_3 %13
+ OpStore %res %14
+ %17 = OpLoad %v3uint %res
+ OpReturnValue %17
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+ %21 = OpLabel
+ %22 = OpFunctionCall %v3uint %subgroupBroadcastFirst_5e5b6f
+ %23 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+ OpStore %23 %22
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %20
+ %27 = OpLabel
+ %28 = OpFunctionCall %v3uint %subgroupBroadcastFirst_5e5b6f
+ %29 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+ OpStore %29 %28
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.msl
new file mode 100644
index 0000000..b35fef7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint3 subgroupBroadcastFirst_5e5b6f() {
+ uint3 arg_0 = uint3(1u);
+ uint3 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = packed_uint3(subgroupBroadcastFirst_5e5b6f());
+ return;
+}
+
+kernel void compute_main(device packed_uint3* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = packed_uint3(subgroupBroadcastFirst_5e5b6f());
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.spvasm
new file mode 100644
index 0000000..62a7ea1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupBroadcastFirst_5e5b6f() -> vec3<u32> {
+ var arg_0 = vec3<u32>(1u);
+ var res : vec3<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.wgsl
new file mode 100644
index 0000000..710d64c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/5e5b6f.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+fn subgroupBroadcastFirst_5e5b6f() -> vec3<u32> {
+ var arg_0 = vec3<u32>(1u);
+ var res : vec3<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_5e5b6f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl
new file mode 100644
index 0000000..ea3031d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.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 subgroupBroadcastFirst(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupBroadcastFirst_612d6f() -> vec4<u32>{
+ var arg_0 = vec4<u32>(1u);
+ var res: vec4<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..219293e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupBroadcastFirst_612d6f() {
+ uint4 arg_0 = (1u).xxxx;
+ uint4 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_612d6f()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_612d6f()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..fe8bee0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint4 subgroupBroadcastFirst_612d6f() {
+ uint4 arg_0 = (1u).xxxx;
+ uint4 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_612d6f()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_612d6f()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.glsl
new file mode 100644
index 0000000..c8c5f40
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupBroadcastFirst_612d6f() -> vec4<u32> {
+ var arg_0 = vec4<u32>(1u);
+ var res : vec4<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupBroadcastFirst_612d6f() -> vec4<u32> {
+ var arg_0 = vec4<u32>(1u);
+ var res : vec4<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..a60f267
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint4 subgroupBroadcastFirst_612d6f() {
+ uint4 arg_0 = (1u).xxxx;
+ uint4 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, subgroupBroadcastFirst_612d6f());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, subgroupBroadcastFirst_612d6f());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..c212395
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device uint4* prevent_dce;
+};
+
+uint4 subgroupBroadcastFirst_612d6f() {
+ uint4 arg_0 = uint4(1u);
+ uint4 res = simd_broadcast_first(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) = subgroupBroadcastFirst_612d6f();
+}
+
+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) = subgroupBroadcastFirst_612d6f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..f87ed79
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_612d6f "subgroupBroadcastFirst_612d6f"
+ 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
+%subgroupBroadcastFirst_612d6f = 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 = OpGroupNonUniformBroadcastFirst %v4uint %uint_3 %13
+ OpStore %res %14
+ %17 = OpLoad %v4uint %res
+ OpReturnValue %17
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %20
+ %21 = OpLabel
+ %22 = OpFunctionCall %v4uint %subgroupBroadcastFirst_612d6f
+ %23 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+ OpStore %23 %22
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %20
+ %27 = OpLabel
+ %28 = OpFunctionCall %v4uint %subgroupBroadcastFirst_612d6f
+ %29 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+ OpStore %29 %28
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.msl
new file mode 100644
index 0000000..dd437ff
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint4 subgroupBroadcastFirst_612d6f() {
+ uint4 arg_0 = uint4(1u);
+ uint4 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device uint4* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_612d6f();
+ return;
+}
+
+kernel void compute_main(device uint4* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_612d6f();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.spvasm
new file mode 100644
index 0000000..60f74d1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupBroadcastFirst_612d6f() -> vec4<u32> {
+ var arg_0 = vec4<u32>(1u);
+ var res : vec4<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.wgsl
new file mode 100644
index 0000000..c51764c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/612d6f.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+fn subgroupBroadcastFirst_612d6f() -> vec4<u32> {
+ var arg_0 = vec4<u32>(1u);
+ var res : vec4<u32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_612d6f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl
new file mode 100644
index 0000000..7e12087
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.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 subgroupBroadcastFirst(value: u32) -> u32
+fn subgroupBroadcastFirst_61f177() -> u32{
+ var arg_0 = 1u;
+ var res: u32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3596b3a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupBroadcastFirst_61f177() {
+ uint arg_0 = 1u;
+ uint res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_61f177()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_61f177()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8d733c5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+uint subgroupBroadcastFirst_61f177() {
+ uint arg_0 = 1u;
+ uint res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_61f177()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_61f177()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.glsl
new file mode 100644
index 0000000..58db4ea
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupBroadcastFirst_61f177() -> u32 {
+ var arg_0 = 1u;
+ var res : u32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupBroadcastFirst_61f177() -> u32 {
+ var arg_0 = 1u;
+ var res : u32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..08f9d7f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+uint subgroupBroadcastFirst_61f177() {
+ uint arg_0 = 1u;
+ uint res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, subgroupBroadcastFirst_61f177());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, subgroupBroadcastFirst_61f177());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.ir.msl
new file mode 100644
index 0000000..d160bc5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device uint* prevent_dce;
+};
+
+uint subgroupBroadcastFirst_61f177() {
+ uint arg_0 = 1u;
+ uint res = simd_broadcast_first(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) = subgroupBroadcastFirst_61f177();
+}
+
+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) = subgroupBroadcastFirst_61f177();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6e9a46c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_61f177 "subgroupBroadcastFirst_61f177"
+ 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
+%subgroupBroadcastFirst_61f177 = 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 = OpGroupNonUniformBroadcastFirst %uint %uint_3 %11
+ OpStore %res %12
+ %15 = OpLoad %uint %res
+ OpReturnValue %15
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %18
+ %19 = OpLabel
+ %20 = OpFunctionCall %uint %subgroupBroadcastFirst_61f177
+ %21 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ OpStore %21 %20
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %18
+ %25 = OpLabel
+ %26 = OpFunctionCall %uint %subgroupBroadcastFirst_61f177
+ %27 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+ OpStore %27 %26
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.msl
new file mode 100644
index 0000000..92a592b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+uint subgroupBroadcastFirst_61f177() {
+ uint arg_0 = 1u;
+ uint res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device uint* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_61f177();
+ return;
+}
+
+kernel void compute_main(device uint* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_61f177();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.spvasm
new file mode 100644
index 0000000..9bfc865
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupBroadcastFirst_61f177() -> u32 {
+ var arg_0 = 1u;
+ var res : u32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.wgsl
new file mode 100644
index 0000000..9c57510
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/61f177.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupBroadcastFirst_61f177() -> u32 {
+ var arg_0 = 1u;
+ var res : u32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_61f177();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl
new file mode 100644
index 0000000..6d0c30c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.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<f32>;
+
+
+// fn subgroupBroadcastFirst(value: vec<2, f32>) -> vec<2, f32>
+fn subgroupBroadcastFirst_6945f6() -> vec2<f32>{
+ var arg_0 = vec2<f32>(1.f);
+ var res: vec2<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..32264eb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float2 subgroupBroadcastFirst_6945f6() {
+ float2 arg_0 = (1.0f).xx;
+ float2 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c456e4e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float2 subgroupBroadcastFirst_6945f6() {
+ float2 arg_0 = (1.0f).xx;
+ float2 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.glsl
new file mode 100644
index 0000000..147a954
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+fn subgroupBroadcastFirst_6945f6() -> vec2<f32> {
+ var arg_0 = vec2<f32>(1.0f);
+ var res : vec2<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+fn subgroupBroadcastFirst_6945f6() -> vec2<f32> {
+ var arg_0 = vec2<f32>(1.0f);
+ var res : vec2<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..ea92aca
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+float2 subgroupBroadcastFirst_6945f6() {
+ float2 arg_0 = (1.0f).xx;
+ float2 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_6945f6()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9bec0ff
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device float2* prevent_dce;
+};
+
+float2 subgroupBroadcastFirst_6945f6() {
+ float2 arg_0 = float2(1.0f);
+ float2 res = simd_broadcast_first(arg_0);
+ 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) = subgroupBroadcastFirst_6945f6();
+}
+
+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) = subgroupBroadcastFirst_6945f6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..23f20b6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_6945f6 "subgroupBroadcastFirst_6945f6"
+ 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
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%tint_symbol_1 = OpTypeStruct %v2float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %float_1 = OpConstant %float 1
+ %11 = OpConstantComposite %v2float %float_1 %float_1
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %void = OpTypeVoid
+ %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_6945f6 = OpFunction %v2float None %7
+ %8 = OpLabel
+ %arg_0 = OpVariable %_ptr_Function_v2float Function
+ %res = OpVariable %_ptr_Function_v2float Function
+ OpStore %arg_0 %11
+ %13 = OpLoad %v2float %arg_0
+ %14 = OpGroupNonUniformBroadcastFirst %v2float %uint_3 %13
+ OpStore %res %14
+ %18 = OpLoad %v2float %res
+ OpReturnValue %18
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+ %22 = OpLabel
+ %23 = OpFunctionCall %v2float %subgroupBroadcastFirst_6945f6
+ %24 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+ OpStore %24 %23
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %21
+ %28 = OpLabel
+ %29 = OpFunctionCall %v2float %subgroupBroadcastFirst_6945f6
+ %30 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+ OpStore %30 %29
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.msl
new file mode 100644
index 0000000..6161d39
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+float2 subgroupBroadcastFirst_6945f6() {
+ float2 arg_0 = float2(1.0f);
+ float2 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device float2* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_6945f6();
+ return;
+}
+
+kernel void compute_main(device float2* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_6945f6();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.spvasm
new file mode 100644
index 0000000..137129e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+fn subgroupBroadcastFirst_6945f6() -> vec2<f32> {
+ var arg_0 = vec2<f32>(1.0f);
+ var res : vec2<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.wgsl
new file mode 100644
index 0000000..28ad097
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/6945f6.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+fn subgroupBroadcastFirst_6945f6() -> vec2<f32> {
+ var arg_0 = vec2<f32>(1.0f);
+ var res : vec2<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_6945f6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl
new file mode 100644
index 0000000..042c211
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl
@@ -0,0 +1,63 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+// test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+
+// fn subgroupBroadcastFirst(value: vec<4, f16>) -> vec<4, f16>
+fn subgroupBroadcastFirst_705aad() -> vec4<f16>{
+ var arg_0 = vec4<f16>(1.h);
+ var res: vec4<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a3dda5a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 4> subgroupBroadcastFirst_705aad() {
+ vector<float16_t, 4> arg_0 = (float16_t(1.0h)).xxxx;
+ vector<float16_t, 4> res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..53dfd80
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 4> subgroupBroadcastFirst_705aad() {
+ vector<float16_t, 4> arg_0 = (float16_t(1.0h)).xxxx;
+ vector<float16_t, 4> res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.glsl
new file mode 100644
index 0000000..8c4cd9a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.glsl
@@ -0,0 +1,56 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+fn subgroupBroadcastFirst_705aad() -> vec4<f16> {
+ var arg_0 = vec4<f16>(1.0h);
+ var res : vec4<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+fn subgroupBroadcastFirst_705aad() -> vec4<f16> {
+ var arg_0 = vec4<f16>(1.0h);
+ var res : vec4<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..5f290e6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+vector<float16_t, 4> subgroupBroadcastFirst_705aad() {
+ vector<float16_t, 4> arg_0 = (float16_t(1.0h)).xxxx;
+ vector<float16_t, 4> res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 4> >(0u, subgroupBroadcastFirst_705aad());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.ir.msl
new file mode 100644
index 0000000..653e9e4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device half4* prevent_dce;
+};
+
+half4 subgroupBroadcastFirst_705aad() {
+ half4 arg_0 = half4(1.0h);
+ half4 res = simd_broadcast_first(arg_0);
+ 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) = subgroupBroadcastFirst_705aad();
+}
+
+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) = subgroupBroadcastFirst_705aad();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..e9bed23
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.ir.spvasm
@@ -0,0 +1,66 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+ OpCapability Shader
+ OpCapability Float16
+ OpCapability UniformAndStorageBuffer16BitAccess
+ OpCapability StorageBuffer16BitAccess
+ OpCapability GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_705aad "subgroupBroadcastFirst_705aad"
+ 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
+ %half = OpTypeFloat 16
+ %v4half = OpTypeVector %half 4
+%tint_symbol_1 = OpTypeStruct %v4half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v4half
+%_ptr_Function_v4half = OpTypePointer Function %v4half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+ %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %void = OpTypeVoid
+ %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4half = OpTypePointer StorageBuffer %v4half
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_705aad = OpFunction %v4half None %7
+ %8 = OpLabel
+ %arg_0 = OpVariable %_ptr_Function_v4half Function
+ %res = OpVariable %_ptr_Function_v4half Function
+ OpStore %arg_0 %11
+ %13 = OpLoad %v4half %arg_0
+ %14 = OpGroupNonUniformBroadcastFirst %v4half %uint_3 %13
+ OpStore %res %14
+ %18 = OpLoad %v4half %res
+ OpReturnValue %18
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+ %22 = OpLabel
+ %23 = OpFunctionCall %v4half %subgroupBroadcastFirst_705aad
+ %24 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+ OpStore %24 %23
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %21
+ %28 = OpLabel
+ %29 = OpFunctionCall %v4half %subgroupBroadcastFirst_705aad
+ %30 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+ OpStore %30 %29
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.msl
new file mode 100644
index 0000000..6cd0369
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+half4 subgroupBroadcastFirst_705aad() {
+ half4 arg_0 = half4(1.0h);
+ half4 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device half4* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_705aad();
+ return;
+}
+
+kernel void compute_main(device half4* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_705aad();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.spvasm
new file mode 100644
index 0000000..e339022
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+fn subgroupBroadcastFirst_705aad() -> vec4<f16> {
+ var arg_0 = vec4<f16>(1.0h);
+ var res : vec4<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.wgsl
new file mode 100644
index 0000000..e00379e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/705aad.wgsl.expected.wgsl
@@ -0,0 +1,21 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+fn subgroupBroadcastFirst_705aad() -> vec4<f16> {
+ var arg_0 = vec4<f16>(1.0h);
+ var res : vec4<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_705aad();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl
new file mode 100644
index 0000000..2578d9b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.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 subgroupBroadcastFirst(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupBroadcastFirst_85b351() -> vec2<i32>{
+ var arg_0 = vec2<i32>(1i);
+ var res: vec2<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..edf0784
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupBroadcastFirst_85b351() {
+ int2 arg_0 = (1).xx;
+ int2 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..ff6ed92
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int2 subgroupBroadcastFirst_85b351() {
+ int2 arg_0 = (1).xx;
+ int2 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.glsl
new file mode 100644
index 0000000..83de36c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupBroadcastFirst_85b351() -> vec2<i32> {
+ var arg_0 = vec2<i32>(1i);
+ var res : vec2<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupBroadcastFirst_85b351() -> vec2<i32> {
+ var arg_0 = vec2<i32>(1i);
+ var res : vec2<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..0f59609
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int2 subgroupBroadcastFirst_85b351() {
+ int2 arg_0 = (1).xx;
+ int2 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store2(0u, asuint(subgroupBroadcastFirst_85b351()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.ir.msl
new file mode 100644
index 0000000..b4bb938
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device int2* prevent_dce;
+};
+
+int2 subgroupBroadcastFirst_85b351() {
+ int2 arg_0 = int2(1);
+ int2 res = simd_broadcast_first(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) = subgroupBroadcastFirst_85b351();
+}
+
+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) = subgroupBroadcastFirst_85b351();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..e6ef4ce
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_85b351 "subgroupBroadcastFirst_85b351"
+ 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
+%subgroupBroadcastFirst_85b351 = 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 = OpGroupNonUniformBroadcastFirst %v2int %uint_3 %13
+ OpStore %res %14
+ %18 = OpLoad %v2int %res
+ OpReturnValue %18
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+ %22 = OpLabel
+ %23 = OpFunctionCall %v2int %subgroupBroadcastFirst_85b351
+ %24 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+ OpStore %24 %23
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %21
+ %28 = OpLabel
+ %29 = OpFunctionCall %v2int %subgroupBroadcastFirst_85b351
+ %30 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+ OpStore %30 %29
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.msl
new file mode 100644
index 0000000..a703277
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int2 subgroupBroadcastFirst_85b351() {
+ int2 arg_0 = int2(1);
+ int2 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device int2* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_85b351();
+ return;
+}
+
+kernel void compute_main(device int2* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_85b351();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.spvasm
new file mode 100644
index 0000000..2dc49a6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupBroadcastFirst_85b351() -> vec2<i32> {
+ var arg_0 = vec2<i32>(1i);
+ var res : vec2<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.wgsl
new file mode 100644
index 0000000..155e7d6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/85b351.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+fn subgroupBroadcastFirst_85b351() -> vec2<i32> {
+ var arg_0 = vec2<i32>(1i);
+ var res : vec2<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_85b351();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl
new file mode 100644
index 0000000..a5f3346
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.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<f32>;
+
+
+// fn subgroupBroadcastFirst(value: vec<4, f32>) -> vec<4, f32>
+fn subgroupBroadcastFirst_8ae580() -> vec4<f32>{
+ var arg_0 = vec4<f32>(1.f);
+ var res: vec4<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..737d1dc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float4 subgroupBroadcastFirst_8ae580() {
+ float4 arg_0 = (1.0f).xxxx;
+ float4 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2026ab3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+float4 subgroupBroadcastFirst_8ae580() {
+ float4 arg_0 = (1.0f).xxxx;
+ float4 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.glsl
new file mode 100644
index 0000000..61c0c63
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+fn subgroupBroadcastFirst_8ae580() -> vec4<f32> {
+ var arg_0 = vec4<f32>(1.0f);
+ var res : vec4<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+fn subgroupBroadcastFirst_8ae580() -> vec4<f32> {
+ var arg_0 = vec4<f32>(1.0f);
+ var res : vec4<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..9c12894
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+float4 subgroupBroadcastFirst_8ae580() {
+ float4 arg_0 = (1.0f).xxxx;
+ float4 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_8ae580()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.msl
new file mode 100644
index 0000000..f00dbc2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device float4* prevent_dce;
+};
+
+float4 subgroupBroadcastFirst_8ae580() {
+ float4 arg_0 = float4(1.0f);
+ float4 res = simd_broadcast_first(arg_0);
+ 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) = subgroupBroadcastFirst_8ae580();
+}
+
+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) = subgroupBroadcastFirst_8ae580();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..3bf9849
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_8ae580 "subgroupBroadcastFirst_8ae580"
+ 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
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%tint_symbol_1 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v4float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %float_1 = OpConstant %float 1
+ %11 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %void = OpTypeVoid
+ %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_8ae580 = OpFunction %v4float None %7
+ %8 = OpLabel
+ %arg_0 = OpVariable %_ptr_Function_v4float Function
+ %res = OpVariable %_ptr_Function_v4float Function
+ OpStore %arg_0 %11
+ %13 = OpLoad %v4float %arg_0
+ %14 = OpGroupNonUniformBroadcastFirst %v4float %uint_3 %13
+ OpStore %res %14
+ %18 = OpLoad %v4float %res
+ OpReturnValue %18
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+ %22 = OpLabel
+ %23 = OpFunctionCall %v4float %subgroupBroadcastFirst_8ae580
+ %24 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+ OpStore %24 %23
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %21
+ %28 = OpLabel
+ %29 = OpFunctionCall %v4float %subgroupBroadcastFirst_8ae580
+ %30 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+ OpStore %30 %29
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.msl
new file mode 100644
index 0000000..9b94ad3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+float4 subgroupBroadcastFirst_8ae580() {
+ float4 arg_0 = float4(1.0f);
+ float4 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device float4* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_8ae580();
+ return;
+}
+
+kernel void compute_main(device float4* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_8ae580();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.spvasm
new file mode 100644
index 0000000..d81b13f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+fn subgroupBroadcastFirst_8ae580() -> vec4<f32> {
+ var arg_0 = vec4<f32>(1.0f);
+ var res : vec4<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.wgsl
new file mode 100644
index 0000000..a9de6ff
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/8ae580.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+fn subgroupBroadcastFirst_8ae580() -> vec4<f32> {
+ var arg_0 = vec4<f32>(1.0f);
+ var res : vec4<f32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_8ae580();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl
new file mode 100644
index 0000000..7200a5e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.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 subgroupBroadcastFirst(value: i32) -> i32
+fn subgroupBroadcastFirst_9a1bdc() -> i32{
+ var arg_0 = 1i;
+ var res: i32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..215e5a7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupBroadcastFirst_9a1bdc() {
+ int arg_0 = 1;
+ int res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..773c4d6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupBroadcastFirst_9a1bdc() {
+ int arg_0 = 1;
+ int res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.glsl
new file mode 100644
index 0000000..a5dd1cb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupBroadcastFirst_9a1bdc() -> i32 {
+ var arg_0 = 1i;
+ var res : i32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupBroadcastFirst_9a1bdc() -> i32 {
+ var arg_0 = 1i;
+ var res : i32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..d40cd28
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int subgroupBroadcastFirst_9a1bdc() {
+ int arg_0 = 1;
+ int res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupBroadcastFirst_9a1bdc()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.msl
new file mode 100644
index 0000000..f0e086b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device int* prevent_dce;
+};
+
+int subgroupBroadcastFirst_9a1bdc() {
+ int arg_0 = 1;
+ int res = simd_broadcast_first(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) = subgroupBroadcastFirst_9a1bdc();
+}
+
+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) = subgroupBroadcastFirst_9a1bdc();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..db7eeff
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_9a1bdc "subgroupBroadcastFirst_9a1bdc"
+ 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
+%subgroupBroadcastFirst_9a1bdc = 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 = OpGroupNonUniformBroadcastFirst %int %uint_3 %11
+ OpStore %res %12
+ %16 = OpLoad %int %res
+ OpReturnValue %16
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %19
+ %20 = OpLabel
+ %21 = OpFunctionCall %int %subgroupBroadcastFirst_9a1bdc
+ %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+ OpStore %22 %21
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %19
+ %26 = OpLabel
+ %27 = OpFunctionCall %int %subgroupBroadcastFirst_9a1bdc
+ %28 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+ OpStore %28 %27
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.msl
new file mode 100644
index 0000000..6123945
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int subgroupBroadcastFirst_9a1bdc() {
+ int arg_0 = 1;
+ int res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device int* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_9a1bdc();
+ return;
+}
+
+kernel void compute_main(device int* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_9a1bdc();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.spvasm
new file mode 100644
index 0000000..a277780
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupBroadcastFirst_9a1bdc() -> i32 {
+ var arg_0 = 1i;
+ var res : i32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.wgsl
new file mode 100644
index 0000000..8542a5b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9a1bdc.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupBroadcastFirst_9a1bdc() -> i32 {
+ var arg_0 = 1i;
+ var res : i32 = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9a1bdc();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl
new file mode 100644
index 0000000..08e65c2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.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 subgroupBroadcastFirst(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupBroadcastFirst_9dccee() -> vec4<i32>{
+ var arg_0 = vec4<i32>(1i);
+ var res: vec4<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..42ad1ee
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupBroadcastFirst_9dccee() {
+ int4 arg_0 = (1).xxxx;
+ int4 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d9e0ee3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int4 subgroupBroadcastFirst_9dccee() {
+ int4 arg_0 = (1).xxxx;
+ int4 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.glsl
new file mode 100644
index 0000000..0a70c49
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupBroadcastFirst_9dccee() -> vec4<i32> {
+ var arg_0 = vec4<i32>(1i);
+ var res : vec4<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupBroadcastFirst_9dccee() -> vec4<i32> {
+ var arg_0 = vec4<i32>(1i);
+ var res : vec4<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..f1eb409
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int4 subgroupBroadcastFirst_9dccee() {
+ int4 arg_0 = (1).xxxx;
+ int4 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store4(0u, asuint(subgroupBroadcastFirst_9dccee()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.msl
new file mode 100644
index 0000000..1224aa5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device int4* prevent_dce;
+};
+
+int4 subgroupBroadcastFirst_9dccee() {
+ int4 arg_0 = int4(1);
+ int4 res = simd_broadcast_first(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) = subgroupBroadcastFirst_9dccee();
+}
+
+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) = subgroupBroadcastFirst_9dccee();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..8ffd437
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_9dccee "subgroupBroadcastFirst_9dccee"
+ 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
+%subgroupBroadcastFirst_9dccee = 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 = OpGroupNonUniformBroadcastFirst %v4int %uint_3 %13
+ OpStore %res %14
+ %18 = OpLoad %v4int %res
+ OpReturnValue %18
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+ %22 = OpLabel
+ %23 = OpFunctionCall %v4int %subgroupBroadcastFirst_9dccee
+ %24 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+ OpStore %24 %23
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %21
+ %28 = OpLabel
+ %29 = OpFunctionCall %v4int %subgroupBroadcastFirst_9dccee
+ %30 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+ OpStore %30 %29
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.msl
new file mode 100644
index 0000000..11eb3af
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int4 subgroupBroadcastFirst_9dccee() {
+ int4 arg_0 = int4(1);
+ int4 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device int4* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_9dccee();
+ return;
+}
+
+kernel void compute_main(device int4* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_9dccee();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.spvasm
new file mode 100644
index 0000000..c0f8a55
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupBroadcastFirst_9dccee() -> vec4<i32> {
+ var arg_0 = vec4<i32>(1i);
+ var res : vec4<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.wgsl
new file mode 100644
index 0000000..7f51c15
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/9dccee.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+fn subgroupBroadcastFirst_9dccee() -> vec4<i32> {
+ var arg_0 = vec4<i32>(1i);
+ var res : vec4<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_9dccee();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl
new file mode 100644
index 0000000..e0d5be2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl
@@ -0,0 +1,63 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+// test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+
+// fn subgroupBroadcastFirst(value: vec<2, f16>) -> vec<2, f16>
+fn subgroupBroadcastFirst_a11307() -> vec2<f16>{
+ var arg_0 = vec2<f16>(1.h);
+ var res: vec2<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..010261b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 2> subgroupBroadcastFirst_a11307() {
+ vector<float16_t, 2> arg_0 = (float16_t(1.0h)).xx;
+ vector<float16_t, 2> res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..906a1e1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+vector<float16_t, 2> subgroupBroadcastFirst_a11307() {
+ vector<float16_t, 2> arg_0 = (float16_t(1.0h)).xx;
+ vector<float16_t, 2> res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.glsl
new file mode 100644
index 0000000..ce6514b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.glsl
@@ -0,0 +1,56 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+fn subgroupBroadcastFirst_a11307() -> vec2<f16> {
+ var arg_0 = vec2<f16>(1.0h);
+ var res : vec2<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+fn subgroupBroadcastFirst_a11307() -> vec2<f16> {
+ var arg_0 = vec2<f16>(1.0h);
+ var res : vec2<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..194e1b8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+vector<float16_t, 2> subgroupBroadcastFirst_a11307() {
+ vector<float16_t, 2> arg_0 = (float16_t(1.0h)).xx;
+ vector<float16_t, 2> res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store<vector<float16_t, 2> >(0u, subgroupBroadcastFirst_a11307());
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.ir.msl
new file mode 100644
index 0000000..f05b6d4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device half2* prevent_dce;
+};
+
+half2 subgroupBroadcastFirst_a11307() {
+ half2 arg_0 = half2(1.0h);
+ half2 res = simd_broadcast_first(arg_0);
+ 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) = subgroupBroadcastFirst_a11307();
+}
+
+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) = subgroupBroadcastFirst_a11307();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..a0baf1c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.ir.spvasm
@@ -0,0 +1,66 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 31
+; Schema: 0
+ OpCapability Shader
+ OpCapability Float16
+ OpCapability UniformAndStorageBuffer16BitAccess
+ OpCapability StorageBuffer16BitAccess
+ OpCapability GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_a11307 "subgroupBroadcastFirst_a11307"
+ 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
+ %half = OpTypeFloat 16
+ %v2half = OpTypeVector %half 2
+%tint_symbol_1 = OpTypeStruct %v2half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+ %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+ %7 = OpTypeFunction %v2half
+%_ptr_Function_v2half = OpTypePointer Function %v2half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+ %11 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_0
+ %uint = OpTypeInt 32 0
+ %uint_3 = OpConstant %uint 3
+ %void = OpTypeVoid
+ %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2half = OpTypePointer StorageBuffer %v2half
+ %uint_0 = OpConstant %uint 0
+%subgroupBroadcastFirst_a11307 = OpFunction %v2half None %7
+ %8 = OpLabel
+ %arg_0 = OpVariable %_ptr_Function_v2half Function
+ %res = OpVariable %_ptr_Function_v2half Function
+ OpStore %arg_0 %11
+ %13 = OpLoad %v2half %arg_0
+ %14 = OpGroupNonUniformBroadcastFirst %v2half %uint_3 %13
+ OpStore %res %14
+ %18 = OpLoad %v2half %res
+ OpReturnValue %18
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+ %22 = OpLabel
+ %23 = OpFunctionCall %v2half %subgroupBroadcastFirst_a11307
+ %24 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+ OpStore %24 %23
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %21
+ %28 = OpLabel
+ %29 = OpFunctionCall %v2half %subgroupBroadcastFirst_a11307
+ %30 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+ OpStore %30 %29
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.msl
new file mode 100644
index 0000000..9dae7ca
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+half2 subgroupBroadcastFirst_a11307() {
+ half2 arg_0 = half2(1.0h);
+ half2 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device half2* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupBroadcastFirst_a11307();
+ return;
+}
+
+kernel void compute_main(device half2* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupBroadcastFirst_a11307();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.spvasm
new file mode 100644
index 0000000..8af4929
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+SKIP: FAILED
+
+
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+fn subgroupBroadcastFirst_a11307() -> vec2<f16> {
+ var arg_0 = vec2<f16>(1.0h);
+ var res : vec2<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.wgsl
new file mode 100644
index 0000000..3a2f497
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/a11307.wgsl.expected.wgsl
@@ -0,0 +1,21 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+fn subgroupBroadcastFirst_a11307() -> vec2<f16> {
+ var arg_0 = vec2<f16>(1.0h);
+ var res : vec2<f16> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_a11307();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl
new file mode 100644
index 0000000..0ab8305
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.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 subgroupBroadcastFirst(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupBroadcastFirst_e820d4() -> vec3<i32>{
+ var arg_0 = vec3<i32>(1i);
+ var res: vec3<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..aa4b383
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupBroadcastFirst_e820d4() {
+ int3 arg_0 = (1).xxx;
+ int3 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0b4261f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.fxc.hlsl
@@ -0,0 +1,20 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int3 subgroupBroadcastFirst_e820d4() {
+ int3 arg_0 = (1).xxx;
+ int3 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.glsl
new file mode 100644
index 0000000..c37b279
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.glsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupBroadcastFirst_e820d4() -> vec3<i32> {
+ var arg_0 = vec3<i32>(1i);
+ var res : vec3<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupBroadcastFirst_e820d4() -> vec3<i32> {
+ var arg_0 = vec3<i32>(1i);
+ var res : vec3<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..f48d597
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,17 @@
+
+RWByteAddressBuffer prevent_dce : register(u0);
+int3 subgroupBroadcastFirst_e820d4() {
+ int3 arg_0 = (1).xxx;
+ int3 res = WaveReadLaneFirst(arg_0);
+ return res;
+}
+
+void fragment_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store3(0u, asuint(subgroupBroadcastFirst_e820d4()));
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.msl
new file mode 100644
index 0000000..94f013e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+ device int3* prevent_dce;
+};
+
+int3 subgroupBroadcastFirst_e820d4() {
+ int3 arg_0 = int3(1);
+ int3 res = simd_broadcast_first(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) = subgroupBroadcastFirst_e820d4();
+}
+
+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) = subgroupBroadcastFirst_e820d4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b612eef
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.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 GroupNonUniformBallot
+ 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 %subgroupBroadcastFirst_e820d4 "subgroupBroadcastFirst_e820d4"
+ 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
+%subgroupBroadcastFirst_e820d4 = 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 = OpGroupNonUniformBroadcastFirst %v3int %uint_3 %13
+ OpStore %res %14
+ %18 = OpLoad %v3int %res
+ OpReturnValue %18
+ OpFunctionEnd
+%fragment_main = OpFunction %void None %21
+ %22 = OpLabel
+ %23 = OpFunctionCall %v3int %subgroupBroadcastFirst_e820d4
+ %24 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+ OpStore %24 %23
+ OpReturn
+ OpFunctionEnd
+%compute_main = OpFunction %void None %21
+ %28 = OpLabel
+ %29 = OpFunctionCall %v3int %subgroupBroadcastFirst_e820d4
+ %30 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+ OpStore %30 %29
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.msl
new file mode 100644
index 0000000..c461e52
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int3 subgroupBroadcastFirst_e820d4() {
+ int3 arg_0 = int3(1);
+ int3 res = simd_broadcast_first(arg_0);
+ return res;
+}
+
+fragment void fragment_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = packed_int3(subgroupBroadcastFirst_e820d4());
+ return;
+}
+
+kernel void compute_main(device packed_int3* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = packed_int3(subgroupBroadcastFirst_e820d4());
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.spvasm
new file mode 100644
index 0000000..a82bb34
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupBroadcastFirst_e820d4() -> vec3<i32> {
+ var arg_0 = vec3<i32>(1i);
+ var res : vec3<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.wgsl
new file mode 100644
index 0000000..c4da29a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupBroadcastFirst/e820d4.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+fn subgroupBroadcastFirst_e820d4() -> vec3<i32> {
+ var arg_0 = vec3<i32>(1i);
+ var res : vec3<i32> = subgroupBroadcastFirst(arg_0);
+ return res;
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupBroadcastFirst_e820d4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl
new file mode 100644
index 0000000..bd112d5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupElect/3943d6.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 subgroupElect() -> bool
+fn subgroupElect_3943d6() -> i32{
+ var res: bool = subgroupElect();
+ return select(0, 1, all(res == bool()));
+}
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..23a9b78
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupElect_3943d6() {
+ bool res = WaveIsFirstLane();
+ return (all((res == false)) ? 1 : 0);
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupElect_3943d6()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupElect_3943d6()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c05cc9d5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: Wave ops not supported before SM 6.0
+
+RWByteAddressBuffer prevent_dce : register(u0);
+
+int subgroupElect_3943d6() {
+ bool res = WaveIsFirstLane();
+ return (all((res == false)) ? 1 : 0);
+}
+
+void fragment_main() {
+ prevent_dce.Store(0u, asuint(subgroupElect_3943d6()));
+ return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+ prevent_dce.Store(0u, asuint(subgroupElect_3943d6()));
+ return;
+}
diff --git a/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.glsl
new file mode 100644
index 0000000..366d486
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.glsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupElect_3943d6() -> i32 {
+ var res : bool = subgroupElect();
+ return select(0, 1, all((res == bool())));
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupElect_3943d6() -> i32 {
+ var res : bool = subgroupElect();
+ return select(0, 1, all((res == bool())));
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+Failed to generate: <dawn>/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl:41:8 error: GLSL backend does not support extension 'subgroups'
+enable subgroups;
+ ^^^^^^^^^
+
diff --git a/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.msl
new file mode 100644
index 0000000..79f7031
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.msl
@@ -0,0 +1,18 @@
+#include <metal_stdlib>
+
+using namespace metal;
+int subgroupElect_3943d6() {
+ bool res = simd_is_first();
+ return select(0, 1, all((res == false)));
+}
+
+fragment void fragment_main(device int* tint_symbol [[buffer(0)]]) {
+ *(tint_symbol) = subgroupElect_3943d6();
+ return;
+}
+
+kernel void compute_main(device int* tint_symbol_1 [[buffer(0)]]) {
+ *(tint_symbol_1) = subgroupElect_3943d6();
+ return;
+}
+
diff --git a/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.spvasm
new file mode 100644
index 0000000..170103b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupElect_3943d6() -> i32 {
+ var res : bool = subgroupElect();
+ return select(0, 1, all((res == bool())));
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+Failed to generate:
diff --git a/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.wgsl
new file mode 100644
index 0000000..0564231
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupElect/3943d6.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupElect_3943d6() -> i32 {
+ var res : bool = subgroupElect();
+ return select(0, 1, all((res == bool())));
+}
+
+@fragment
+fn fragment_main() {
+ prevent_dce = subgroupElect_3943d6();
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+ prevent_dce = subgroupElect_3943d6();
+}