[msl] Add subgroupMatrixScalarMultiply

Add support for subgroupMatrixScalarMultiply by converting it into a
multiply of the matrix and an diagonal matrix created from the scalar
value

Fixed: 457426179
Change-Id: If711a92dedec8fbbcb65ed812dbd5c2064d22f40
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/271314
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/msl/writer/raise/builtin_polyfill.cc b/src/tint/lang/msl/writer/raise/builtin_polyfill.cc
index 668cb4f..dcb1fd59 100644
--- a/src/tint/lang/msl/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/msl/writer/raise/builtin_polyfill.cc
@@ -119,6 +119,7 @@
                     case core::BuiltinFn::kSubgroupMatrixMultiplyAccumulate:
                     case core::BuiltinFn::kSubgroupMatrixScalarAdd:
                     case core::BuiltinFn::kSubgroupMatrixScalarSubtract:
+                    case core::BuiltinFn::kSubgroupMatrixScalarMultiply:
                     case core::BuiltinFn::kTextureDimensions:
                     case core::BuiltinFn::kTextureGather:
                     case core::BuiltinFn::kTextureGatherCompare:
@@ -315,6 +316,9 @@
                 case core::BuiltinFn::kSubgroupMatrixScalarSubtract:
                     SubgroupMatrixScalarSubtract(builtin);
                     break;
+                case core::BuiltinFn::kSubgroupMatrixScalarMultiply:
+                    SubgroupMatrixScalarMultiply(builtin);
+                    break;
 
                 default:
                     break;
@@ -1228,6 +1232,46 @@
         });
         builtin->Destroy();
     }
+
+    /// Replace a subgroupMatrixScalarMultiply builtin.
+    /// @param builtin the builtin call instruction
+    void SubgroupMatrixScalarMultiply(core::ir::CoreBuiltinCall* builtin) {
+        b.InsertBefore(builtin, [&] {
+            auto* mat = builtin->Args()[0];
+            auto* scalar = builtin->Args()[1];
+
+            auto* sm_ty = mat->Type()->As<core::type::SubgroupMatrix>();
+            TINT_ASSERT(sm_ty);
+
+            auto* left_ty = ty.subgroup_matrix(core::SubgroupMatrixKind::kLeft, sm_ty->Type(),
+                                               sm_ty->Columns(), sm_ty->Rows());
+            auto* right_ty = ty.subgroup_matrix(core::SubgroupMatrixKind::kRight, sm_ty->Type(),
+                                                sm_ty->Columns(), sm_ty->Rows());
+            auto* result_ty = ty.subgroup_matrix(core::SubgroupMatrixKind::kResult, sm_ty->Type(),
+                                                 sm_ty->Columns(), sm_ty->Rows());
+
+            // Declare a local variable to receive the result.
+            auto* tmp = b.Var(ty.ptr<function>(result_ty));
+
+            auto* val = b.CallExplicit<msl::ir::BuiltinCall>(left_ty, msl::BuiltinFn::kConvert,
+                                                             Vector{left_ty}, mat);
+
+            auto* mul = b.CallExplicit<msl::ir::BuiltinCall>(
+                right_ty, msl::BuiltinFn::kMakeDiagonalSimdgroupMatrix, Vector{right_ty}, scalar);
+
+            // Note: We need to use a `load` instruction to pass the variable, as the intrinsic
+            // definition expects a value type (as we do not have reference types in the IR). The
+            // printer will just fold away the load, which achieves the pass-by-reference semantics
+            // that we want.
+            b.Call<msl::ir::BuiltinCall>(ty.void_(), msl::BuiltinFn::kSimdgroupMultiply,
+                                         b.Load(tmp->Result()), val, mul);
+            auto* ld = b.Load(tmp);
+
+            b.CallExplicitWithResult<msl::ir::BuiltinCall>(
+                builtin->DetachResult(), msl::BuiltinFn::kConvert, Vector{sm_ty}, ld);
+        });
+        builtin->Destroy();
+    }
 };
 
 }  // namespace
diff --git a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/0043a7.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/0043a7.wgsl.expected.msl
index ee7074a..7f6f242 100644
--- a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/0043a7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/0043a7.wgsl.expected.msl
@@ -1,12 +1,31 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<float, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_float8x8 subgroupMatrixScalarMultiply_0043a7() {
+  simdgroup_float8x8 v = make_filled_simdgroup_matrix<float, 8, 8>(0.0f);
+  simdgroup_float8x8 const v_1 = simdgroup_float8x8();
+  simdgroup_multiply(v, v_1, simdgroup_float8x8(8.0f));
+  simdgroup_float8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<float, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_0043a7(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/3ec99d.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/3ec99d.wgsl.expected.msl
index ee7074a..d9f4e7d 100644
--- a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/3ec99d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/3ec99d.wgsl.expected.msl
@@ -1,12 +1,31 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<half, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_half8x8 subgroupMatrixScalarMultiply_3ec99d() {
+  simdgroup_half8x8 v = make_filled_simdgroup_matrix<half, 8, 8>(0.0h);
+  simdgroup_half8x8 const v_1 = simdgroup_half8x8();
+  simdgroup_multiply(v, v_1, simdgroup_half8x8(8.0h));
+  simdgroup_half8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<half, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_3ec99d(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/4de795.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/4de795.wgsl.expected.msl
index ee7074a..7dd2d11 100644
--- a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/4de795.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/4de795.wgsl.expected.msl
@@ -1,12 +1,31 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<half, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_half8x8 subgroupMatrixScalarMultiply_4de795() {
+  simdgroup_half8x8 v = make_filled_simdgroup_matrix<half, 8, 8>(0.0h);
+  simdgroup_half8x8 const v_1 = simdgroup_half8x8();
+  simdgroup_multiply(v, v_1, simdgroup_half8x8(8.0h));
+  simdgroup_half8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<half, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_4de795(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/9ec228.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/9ec228.wgsl.expected.msl
index ee7074a..4a745c8 100644
--- a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/9ec228.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/9ec228.wgsl.expected.msl
@@ -1,12 +1,31 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<float, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_float8x8 subgroupMatrixScalarMultiply_9ec228() {
+  simdgroup_float8x8 v = make_filled_simdgroup_matrix<float, 8, 8>(0.0f);
+  simdgroup_float8x8 const v_1 = simdgroup_float8x8();
+  simdgroup_multiply(v, v_1, simdgroup_float8x8(8.0f));
+  simdgroup_float8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<float, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_9ec228(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/decf0b.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/decf0b.wgsl.expected.msl
index ee7074a..36f2324 100644
--- a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/decf0b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/decf0b.wgsl.expected.msl
@@ -1,12 +1,31 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<float, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_float8x8 subgroupMatrixScalarMultiply_decf0b() {
+  simdgroup_float8x8 v = make_filled_simdgroup_matrix<float, 8, 8>(0.0f);
+  simdgroup_float8x8 const v_1 = simdgroup_float8x8();
+  simdgroup_multiply(v, v_1, simdgroup_float8x8(8.0f));
+  simdgroup_float8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<float, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_decf0b(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/ec8d95.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/ec8d95.wgsl.expected.msl
index ee7074a..152ec53 100644
--- a/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/ec8d95.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMatrixScalarMultiply/ec8d95.wgsl.expected.msl
@@ -1,12 +1,31 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<half, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_half8x8 subgroupMatrixScalarMultiply_ec8d95() {
+  simdgroup_half8x8 v = make_filled_simdgroup_matrix<half, 8, 8>(0.0h);
+  simdgroup_half8x8 const v_1 = simdgroup_half8x8();
+  simdgroup_multiply(v, v_1, simdgroup_half8x8(8.0h));
+  simdgroup_half8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<half, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_ec8d95(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/0043a7.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/0043a7.wgsl.expected.msl
index ee7074a..0614bcf 100644
--- a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/0043a7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/0043a7.wgsl.expected.msl
@@ -1,12 +1,32 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<float, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_float8x8 subgroupMatrixScalarMultiply_0043a7() {
+  simdgroup_float8x8 arg_0 = simdgroup_float8x8();
+  float arg_1 = 8.0f;
+  simdgroup_float8x8 v = make_filled_simdgroup_matrix<float, 8, 8>(0.0f);
+  simdgroup_multiply(v, arg_0, simdgroup_float8x8(arg_1));
+  simdgroup_float8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<float, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_0043a7(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/3ec99d.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/3ec99d.wgsl.expected.msl
index ee7074a..8207476 100644
--- a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/3ec99d.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/3ec99d.wgsl.expected.msl
@@ -1,12 +1,32 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<half, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_half8x8 subgroupMatrixScalarMultiply_3ec99d() {
+  simdgroup_half8x8 arg_0 = simdgroup_half8x8();
+  half arg_1 = 8.0h;
+  simdgroup_half8x8 v = make_filled_simdgroup_matrix<half, 8, 8>(0.0h);
+  simdgroup_multiply(v, arg_0, simdgroup_half8x8(arg_1));
+  simdgroup_half8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<half, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_3ec99d(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/4de795.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/4de795.wgsl.expected.msl
index ee7074a..3ab7ad4 100644
--- a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/4de795.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/4de795.wgsl.expected.msl
@@ -1,12 +1,32 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<half, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_half8x8 subgroupMatrixScalarMultiply_4de795() {
+  simdgroup_half8x8 arg_0 = simdgroup_half8x8();
+  half arg_1 = 8.0h;
+  simdgroup_half8x8 v = make_filled_simdgroup_matrix<half, 8, 8>(0.0h);
+  simdgroup_multiply(v, arg_0, simdgroup_half8x8(arg_1));
+  simdgroup_half8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<half, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_4de795(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/9ec228.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/9ec228.wgsl.expected.msl
index ee7074a..056e5c4 100644
--- a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/9ec228.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/9ec228.wgsl.expected.msl
@@ -1,12 +1,32 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<float, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_float8x8 subgroupMatrixScalarMultiply_9ec228() {
+  simdgroup_float8x8 arg_0 = simdgroup_float8x8();
+  float arg_1 = 8.0f;
+  simdgroup_float8x8 v = make_filled_simdgroup_matrix<float, 8, 8>(0.0f);
+  simdgroup_multiply(v, arg_0, simdgroup_float8x8(arg_1));
+  simdgroup_float8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<float, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_9ec228(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/decf0b.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/decf0b.wgsl.expected.msl
index ee7074a..f771f82 100644
--- a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/decf0b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/decf0b.wgsl.expected.msl
@@ -1,12 +1,32 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<float, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_float8x8 subgroupMatrixScalarMultiply_decf0b() {
+  simdgroup_float8x8 arg_0 = simdgroup_float8x8();
+  float arg_1 = 8.0f;
+  simdgroup_float8x8 v = make_filled_simdgroup_matrix<float, 8, 8>(0.0f);
+  simdgroup_multiply(v, arg_0, simdgroup_float8x8(arg_1));
+  simdgroup_float8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<float, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_decf0b(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}
diff --git a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/ec8d95.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/ec8d95.wgsl.expected.msl
index ee7074a..ef0ff19 100644
--- a/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/ec8d95.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMatrixScalarMultiply/ec8d95.wgsl.expected.msl
@@ -1,12 +1,32 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:1222 internal compiler error: TINT_UNREACHABLE unhandled: subgroupMatrixScalarMultiply
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-********************************************************************
-*  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 tint_array<half, 1024>* prevent_dce;
+};
 
-tint executable returned error: signal: trace/BPT trap
+simdgroup_half8x8 subgroupMatrixScalarMultiply_ec8d95() {
+  simdgroup_half8x8 arg_0 = simdgroup_half8x8();
+  half arg_1 = 8.0h;
+  simdgroup_half8x8 v = make_filled_simdgroup_matrix<half, 8, 8>(0.0h);
+  simdgroup_multiply(v, arg_0, simdgroup_half8x8(arg_1));
+  simdgroup_half8x8 res = v;
+  return res;
+}
+
+kernel void compute_main(device tint_array<half, 1024>* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  simdgroup_store(subgroupMatrixScalarMultiply_ec8d95(), (&(*tint_module_vars.prevent_dce)[0u]), ulong(64u), ulong2(0ul), false);
+}