[tint] Rename spirv::ir::Function to spirv::BuiltinFn

To match core::BuiltinFn.

This also moves the class down to the tint::spirv namespace to match
other languages.

Change-Id: Ide6f6b241b19f19bc6a7e372fa8d876435187d45
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/152543
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/spirv/BUILD.bazel b/src/tint/lang/spirv/BUILD.bazel
index 9f81589..a2906a0 100644
--- a/src/tint/lang/spirv/BUILD.bazel
+++ b/src/tint/lang/spirv/BUILD.bazel
@@ -23,4 +23,18 @@
 
 load("//src/tint:flags.bzl", "COPTS")
 load("@bazel_skylib//lib:selects.bzl", "selects")
+cc_library(
+  name = "spirv",
+  srcs = [
+    "builtin_fn.cc",
+  ],
+  hdrs = [
+    "builtin_fn.h",
+  ],
+  deps = [
+    "//src/tint/utils/traits",
+  ],
+  copts = COPTS,
+  visibility = ["//visibility:public"],
+)
 
diff --git a/src/tint/lang/spirv/BUILD.cmake b/src/tint/lang/spirv/BUILD.cmake
index c6fc438..1a2be15 100644
--- a/src/tint/lang/spirv/BUILD.cmake
+++ b/src/tint/lang/spirv/BUILD.cmake
@@ -26,3 +26,16 @@
 include(lang/spirv/reader/BUILD.cmake)
 include(lang/spirv/type/BUILD.cmake)
 include(lang/spirv/writer/BUILD.cmake)
+
+################################################################################
+# Target:    tint_lang_spirv
+# Kind:      lib
+################################################################################
+tint_add_target(tint_lang_spirv lib
+  lang/spirv/builtin_fn.cc
+  lang/spirv/builtin_fn.h
+)
+
+tint_target_add_dependencies(tint_lang_spirv lib
+  tint_utils_traits
+)
diff --git a/src/tint/lang/spirv/BUILD.gn b/src/tint/lang/spirv/BUILD.gn
index b8a448e..0bfa460 100644
--- a/src/tint/lang/spirv/BUILD.gn
+++ b/src/tint/lang/spirv/BUILD.gn
@@ -24,3 +24,11 @@
 import("../../../../scripts/tint_overrides_with_defaults.gni")
 
 import("${tint_src_dir}/tint.gni")
+
+libtint_source_set("spirv") {
+  sources = [
+    "builtin_fn.cc",
+    "builtin_fn.h",
+  ]
+  deps = [ "${tint_src_dir}/utils/traits" ]
+}
diff --git a/src/tint/lang/spirv/ir/function.cc b/src/tint/lang/spirv/builtin_fn.cc
similarity index 62%
rename from src/tint/lang/spirv/ir/function.cc
rename to src/tint/lang/spirv/builtin_fn.cc
index bb86b6c..e7b5549 100644
--- a/src/tint/lang/spirv/ir/function.cc
+++ b/src/tint/lang/spirv/builtin_fn.cc
@@ -14,79 +14,79 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/spirv/ir/function.cc.tmpl
+//   src/tint/lang/spirv/builtin_fn.cc.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#include "src/tint/lang/spirv/ir/function.h"
+#include "src/tint/lang/spirv/builtin_fn.h"
 
-namespace tint::spirv::ir {
+namespace tint::spirv {
 
-const char* str(Function i) {
+const char* str(BuiltinFn i) {
     switch (i) {
-        case Function::kNone:
+        case BuiltinFn::kNone:
             return "<none>";
-        case Function::kArrayLength:
+        case BuiltinFn::kArrayLength:
             return "spirv.array_length";
-        case Function::kAtomicAnd:
+        case BuiltinFn::kAtomicAnd:
             return "spirv.atomic_and";
-        case Function::kAtomicCompareExchange:
+        case BuiltinFn::kAtomicCompareExchange:
             return "spirv.atomic_compare_exchange";
-        case Function::kAtomicExchange:
+        case BuiltinFn::kAtomicExchange:
             return "spirv.atomic_exchange";
-        case Function::kAtomicIadd:
+        case BuiltinFn::kAtomicIadd:
             return "spirv.atomic_iadd";
-        case Function::kAtomicIsub:
+        case BuiltinFn::kAtomicIsub:
             return "spirv.atomic_isub";
-        case Function::kAtomicLoad:
+        case BuiltinFn::kAtomicLoad:
             return "spirv.atomic_load";
-        case Function::kAtomicOr:
+        case BuiltinFn::kAtomicOr:
             return "spirv.atomic_or";
-        case Function::kAtomicSmax:
+        case BuiltinFn::kAtomicSmax:
             return "spirv.atomic_smax";
-        case Function::kAtomicSmin:
+        case BuiltinFn::kAtomicSmin:
             return "spirv.atomic_smin";
-        case Function::kAtomicStore:
+        case BuiltinFn::kAtomicStore:
             return "spirv.atomic_store";
-        case Function::kAtomicUmax:
+        case BuiltinFn::kAtomicUmax:
             return "spirv.atomic_umax";
-        case Function::kAtomicUmin:
+        case BuiltinFn::kAtomicUmin:
             return "spirv.atomic_umin";
-        case Function::kAtomicXor:
+        case BuiltinFn::kAtomicXor:
             return "spirv.atomic_xor";
-        case Function::kDot:
+        case BuiltinFn::kDot:
             return "spirv.dot";
-        case Function::kImageDrefGather:
+        case BuiltinFn::kImageDrefGather:
             return "spirv.image_dref_gather";
-        case Function::kImageFetch:
+        case BuiltinFn::kImageFetch:
             return "spirv.image_fetch";
-        case Function::kImageGather:
+        case BuiltinFn::kImageGather:
             return "spirv.image_gather";
-        case Function::kImageQuerySize:
+        case BuiltinFn::kImageQuerySize:
             return "spirv.image_query_size";
-        case Function::kImageQuerySizeLod:
+        case BuiltinFn::kImageQuerySizeLod:
             return "spirv.image_query_size_lod";
-        case Function::kImageRead:
+        case BuiltinFn::kImageRead:
             return "spirv.image_read";
-        case Function::kMatrixTimesMatrix:
+        case BuiltinFn::kMatrixTimesMatrix:
             return "spirv.matrix_times_matrix";
-        case Function::kMatrixTimesScalar:
+        case BuiltinFn::kMatrixTimesScalar:
             return "spirv.matrix_times_scalar";
-        case Function::kMatrixTimesVector:
+        case BuiltinFn::kMatrixTimesVector:
             return "spirv.matrix_times_vector";
-        case Function::kSampledImage:
+        case BuiltinFn::kSampledImage:
             return "spirv.sampled_image";
-        case Function::kSelect:
+        case BuiltinFn::kSelect:
             return "spirv.select";
-        case Function::kVectorTimesMatrix:
+        case BuiltinFn::kVectorTimesMatrix:
             return "spirv.vector_times_matrix";
-        case Function::kVectorTimesScalar:
+        case BuiltinFn::kVectorTimesScalar:
             return "spirv.vector_times_scalar";
     }
     return "<unknown>";
 }
 
-}  // namespace tint::spirv::ir
+}  // namespace tint::spirv
diff --git a/src/tint/lang/spirv/ir/function.cc.tmpl b/src/tint/lang/spirv/builtin_fn.cc.tmpl
similarity index 67%
rename from src/tint/lang/spirv/ir/function.cc.tmpl
rename to src/tint/lang/spirv/builtin_fn.cc.tmpl
index f745c2a..220d19e 100644
--- a/src/tint/lang/spirv/ir/function.cc.tmpl
+++ b/src/tint/lang/spirv/builtin_fn.cc.tmpl
@@ -1,6 +1,6 @@
 {{- /*
 --------------------------------------------------------------------------------
-Template file for use with tools/src/cmd/gen to generate function.cc
+Template file for use with tools/src/cmd/gen to generate builtin_fn.cc
 
 To update the generated file, run:
     ./tools/run gen
@@ -12,20 +12,20 @@
 */ -}}
 
 {{- $I := LoadIntrinsics "src/tint/lang/spirv/spirv.def" -}}
-#include "src/tint/lang/spirv/ir/function.h"
+#include "src/tint/lang/spirv/builtin_fn.h"
 
-namespace tint::spirv::ir {
+namespace tint::spirv {
 
-const char* str(Function i) {
+const char* str(BuiltinFn i) {
     switch (i) {
-        case Function::kNone:
+        case BuiltinFn::kNone:
             return "<none>";
 {{- range $I.Sem.Builtins  }}
-        case Function::k{{PascalCase .Name}}:
+        case BuiltinFn::k{{PascalCase .Name}}:
             return "spirv.{{.Name}}";
 {{- end  }}
     }
     return "<unknown>";
 }
 
-}  // namespace tint::spirv::ir
+}  // namespace tint::spirv
diff --git a/src/tint/lang/spirv/ir/function.h b/src/tint/lang/spirv/builtin_fn.h
similarity index 84%
rename from src/tint/lang/spirv/ir/function.h
rename to src/tint/lang/spirv/builtin_fn.h
index caeb705..c74eab7 100644
--- a/src/tint/lang/spirv/ir/function.h
+++ b/src/tint/lang/spirv/builtin_fn.h
@@ -14,15 +14,15 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/spirv/ir/function.h.tmpl
+//   src/tint/lang/spirv/builtin_fn.h.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#ifndef SRC_TINT_LANG_SPIRV_IR_FUNCTION_H_
-#define SRC_TINT_LANG_SPIRV_IR_FUNCTION_H_
+#ifndef SRC_TINT_LANG_SPIRV_BUILTIN_FN_H_
+#define SRC_TINT_LANG_SPIRV_BUILTIN_FN_H_
 
 #include <cstdint>
 #include <string>
@@ -30,10 +30,10 @@
 #include "src/tint/utils/traits/traits.h"
 
 // \cond DO_NOT_DOCUMENT
-namespace tint::spirv::ir {
+namespace tint::spirv {
 
 /// Enumerator of all builtin functions
-enum class Function : uint8_t {
+enum class BuiltinFn : uint8_t {
     kArrayLength,
     kAtomicAnd,
     kAtomicCompareExchange,
@@ -67,16 +67,16 @@
 
 /// @returns the name of the builtin function type. The spelling, including
 /// case, matches the name in the WGSL spec.
-const char* str(Function i);
+const char* str(BuiltinFn i);
 
 /// Emits the name of the builtin function type. The spelling, including case,
 /// matches the name in the WGSL spec.
 template <typename STREAM, typename = traits::EnableIfIsOStream<STREAM>>
-auto& operator<<(STREAM& o, Function i) {
+auto& operator<<(STREAM& o, BuiltinFn i) {
     return o << str(i);
 }
 
-}  // namespace tint::spirv::ir
+}  // namespace tint::spirv
 // \endcond
 
-#endif  // SRC_TINT_LANG_SPIRV_IR_FUNCTION_H_
+#endif  // SRC_TINT_LANG_SPIRV_BUILTIN_FN_H_
diff --git a/src/tint/lang/spirv/ir/function.h.tmpl b/src/tint/lang/spirv/builtin_fn.h.tmpl
similarity index 73%
rename from src/tint/lang/spirv/ir/function.h.tmpl
rename to src/tint/lang/spirv/builtin_fn.h.tmpl
index 987568d..94c6bca 100644
--- a/src/tint/lang/spirv/ir/function.h.tmpl
+++ b/src/tint/lang/spirv/builtin_fn.h.tmpl
@@ -1,6 +1,6 @@
 {{- /*
 --------------------------------------------------------------------------------
-Template file for use with tools/src/cmd/gen to generate function.h
+Template file for use with tools/src/cmd/gen to generate builtin_fn.h
 
 To update the generated file, run:
     ./tools/run gen
@@ -13,8 +13,8 @@
 
 {{- $I := LoadIntrinsics "src/tint/lang/spirv/spirv.def" -}}
 
-#ifndef SRC_TINT_LANG_SPIRV_IR_FUNCTION_H_
-#define SRC_TINT_LANG_SPIRV_IR_FUNCTION_H_
+#ifndef SRC_TINT_LANG_SPIRV_BUILTIN_FN_H_
+#define SRC_TINT_LANG_SPIRV_BUILTIN_FN_H_
 
 #include <cstdint>
 #include <string>
@@ -22,10 +22,10 @@
 #include "src/tint/utils/traits/traits.h"
 
 // \cond DO_NOT_DOCUMENT
-namespace tint::spirv::ir {
+namespace tint::spirv {
 
 /// Enumerator of all builtin functions
-enum class Function : uint8_t {
+enum class BuiltinFn : uint8_t {
 {{- range $I.Sem.Builtins }}
     k{{PascalCase .Name}},
 {{- end }}
@@ -34,16 +34,16 @@
 
 /// @returns the name of the builtin function type. The spelling, including
 /// case, matches the name in the WGSL spec.
-const char* str(Function i);
+const char* str(BuiltinFn i);
 
 /// Emits the name of the builtin function type. The spelling, including case,
 /// matches the name in the WGSL spec.
 template <typename STREAM, typename = traits::EnableIfIsOStream<STREAM>>
-auto& operator<<(STREAM& o, Function i) {
+auto& operator<<(STREAM& o, BuiltinFn i) {
   return o << str(i);
 }
 
-}  // namespace tint::spirv::ir
+}  // namespace tint::spirv
 // \endcond
 
-#endif  // SRC_TINT_LANG_SPIRV_IR_FUNCTION_H_
+#endif  // SRC_TINT_LANG_SPIRV_BUILTIN_FN_H_
diff --git a/src/tint/lang/spirv/ir/BUILD.bazel b/src/tint/lang/spirv/ir/BUILD.bazel
index af05ece..7f411b7 100644
--- a/src/tint/lang/spirv/ir/BUILD.bazel
+++ b/src/tint/lang/spirv/ir/BUILD.bazel
@@ -27,13 +27,11 @@
   name = "ir",
   srcs = [
     "builtin_call.cc",
-    "function.cc",
     "intrinsic.cc",
     "intrinsic_call.cc",
   ],
   hdrs = [
     "builtin_call.h",
-    "function.h",
     "intrinsic.h",
     "intrinsic_call.h",
   ],
@@ -44,6 +42,7 @@
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/spirv",
     "//src/tint/lang/spirv/intrinsic/data",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
@@ -78,6 +77,7 @@
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/ir:test",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/spirv",
     "//src/tint/lang/spirv/intrinsic/data",
     "//src/tint/lang/spirv/ir",
     "//src/tint/utils/containers",
diff --git a/src/tint/lang/spirv/ir/BUILD.cmake b/src/tint/lang/spirv/ir/BUILD.cmake
index cb2bfeb..a8726d0 100644
--- a/src/tint/lang/spirv/ir/BUILD.cmake
+++ b/src/tint/lang/spirv/ir/BUILD.cmake
@@ -28,8 +28,6 @@
 tint_add_target(tint_lang_spirv_ir lib
   lang/spirv/ir/builtin_call.cc
   lang/spirv/ir/builtin_call.h
-  lang/spirv/ir/function.cc
-  lang/spirv/ir/function.h
   lang/spirv/ir/intrinsic.cc
   lang/spirv/ir/intrinsic.h
   lang/spirv/ir/intrinsic_call.cc
@@ -43,6 +41,7 @@
   tint_lang_core_intrinsic
   tint_lang_core_ir
   tint_lang_core_type
+  tint_lang_spirv
   tint_lang_spirv_intrinsic_data
   tint_utils_containers
   tint_utils_diagnostic
@@ -77,6 +76,7 @@
   tint_lang_core_ir
   tint_lang_core_ir_test
   tint_lang_core_type
+  tint_lang_spirv
   tint_lang_spirv_intrinsic_data
   tint_lang_spirv_ir
   tint_utils_containers
diff --git a/src/tint/lang/spirv/ir/BUILD.gn b/src/tint/lang/spirv/ir/BUILD.gn
index b8d7d86..81b4544 100644
--- a/src/tint/lang/spirv/ir/BUILD.gn
+++ b/src/tint/lang/spirv/ir/BUILD.gn
@@ -33,8 +33,6 @@
   sources = [
     "builtin_call.cc",
     "builtin_call.h",
-    "function.cc",
-    "function.h",
     "intrinsic.cc",
     "intrinsic.h",
     "intrinsic_call.cc",
@@ -47,6 +45,7 @@
     "${tint_src_dir}/lang/core/intrinsic",
     "${tint_src_dir}/lang/core/ir",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/spirv",
     "${tint_src_dir}/lang/spirv/intrinsic/data",
     "${tint_src_dir}/utils/containers",
     "${tint_src_dir}/utils/diagnostic",
@@ -80,6 +79,7 @@
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/ir:unittests",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/spirv",
       "${tint_src_dir}/lang/spirv/intrinsic/data",
       "${tint_src_dir}/lang/spirv/ir",
       "${tint_src_dir}/utils/containers",
diff --git a/src/tint/lang/spirv/ir/builtin_call.cc b/src/tint/lang/spirv/ir/builtin_call.cc
index 4899ccf..2e077fa 100644
--- a/src/tint/lang/spirv/ir/builtin_call.cc
+++ b/src/tint/lang/spirv/ir/builtin_call.cc
@@ -25,10 +25,10 @@
 namespace tint::spirv::ir {
 
 BuiltinCall::BuiltinCall(core::ir::InstructionResult* result,
-                         Function func,
+                         BuiltinFn func,
                          VectorRef<core::ir::Value*> arguments)
     : Base(result, arguments), func_(func) {
-    TINT_ASSERT(func != Function::kNone);
+    TINT_ASSERT(func != BuiltinFn::kNone);
 }
 
 BuiltinCall::~BuiltinCall() = default;
diff --git a/src/tint/lang/spirv/ir/builtin_call.h b/src/tint/lang/spirv/ir/builtin_call.h
index 235c910..4ae0ee6 100644
--- a/src/tint/lang/spirv/ir/builtin_call.h
+++ b/src/tint/lang/spirv/ir/builtin_call.h
@@ -19,8 +19,8 @@
 
 #include "src/tint/lang/core/intrinsic/table_data.h"
 #include "src/tint/lang/core/ir/builtin_call.h"
+#include "src/tint/lang/spirv/builtin_fn.h"
 #include "src/tint/lang/spirv/intrinsic/data/data.h"
-#include "src/tint/lang/spirv/ir/function.h"
 #include "src/tint/utils/rtti/castable.h"
 
 namespace tint::spirv::ir {
@@ -33,7 +33,7 @@
     /// @param func the builtin function
     /// @param args the conversion arguments
     BuiltinCall(core::ir::InstructionResult* result,
-                Function func,
+                BuiltinFn func,
                 VectorRef<core::ir::Value*> args = tint::Empty);
     ~BuiltinCall() override;
 
@@ -41,7 +41,7 @@
     BuiltinCall* Clone(core::ir::CloneContext& ctx) override;
 
     /// @returns the builtin function
-    Function Func() { return func_; }
+    BuiltinFn Func() { return func_; }
 
     /// @returns the identifier for the function
     size_t FuncId() override { return static_cast<size_t>(func_); }
@@ -56,7 +56,7 @@
     const core::intrinsic::TableData& TableData() override { return spirv::intrinsic::data::kData; }
 
   private:
-    Function func_;
+    BuiltinFn func_;
 };
 
 }  // namespace tint::spirv::ir
diff --git a/src/tint/lang/spirv/ir/builtin_call_test.cc b/src/tint/lang/spirv/ir/builtin_call_test.cc
index 10cf3b0..d10f5f8 100644
--- a/src/tint/lang/spirv/ir/builtin_call_test.cc
+++ b/src/tint/lang/spirv/ir/builtin_call_test.cc
@@ -25,7 +25,7 @@
 using IR_SpirvBuiltinCallTest = core::ir::IRTestHelper;
 
 TEST_F(IR_SpirvBuiltinCallTest, Clone) {
-    auto* builtin = b.Call<BuiltinCall>(mod.Types().f32(), Function::kArrayLength, 1_u, 2_u);
+    auto* builtin = b.Call<BuiltinCall>(mod.Types().f32(), BuiltinFn::kArrayLength, 1_u, 2_u);
 
     auto* new_b = clone_ctx.Clone(builtin);
 
@@ -33,7 +33,7 @@
     EXPECT_NE(builtin->Result(), new_b->Result());
     EXPECT_EQ(mod.Types().f32(), new_b->Result()->Type());
 
-    EXPECT_EQ(Function::kArrayLength, new_b->Func());
+    EXPECT_EQ(BuiltinFn::kArrayLength, new_b->Func());
 
     auto args = new_b->Args();
     EXPECT_EQ(2u, args.Length());
@@ -46,13 +46,13 @@
 }
 
 TEST_F(IR_SpirvBuiltinCallTest, CloneNoArgs) {
-    auto* builtin = b.Call<BuiltinCall>(mod.Types().f32(), Function::kArrayLength);
+    auto* builtin = b.Call<BuiltinCall>(mod.Types().f32(), BuiltinFn::kArrayLength);
 
     auto* new_b = clone_ctx.Clone(builtin);
     EXPECT_NE(builtin->Result(), new_b->Result());
     EXPECT_EQ(mod.Types().f32(), new_b->Result()->Type());
 
-    EXPECT_EQ(Function::kArrayLength, new_b->Func());
+    EXPECT_EQ(BuiltinFn::kArrayLength, new_b->Func());
 
     auto args = new_b->Args();
     EXPECT_TRUE(args.IsEmpty());
diff --git a/src/tint/lang/spirv/writer/BUILD.bazel b/src/tint/lang/spirv/writer/BUILD.bazel
index e42bedf..4123059 100644
--- a/src/tint/lang/spirv/writer/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/BUILD.bazel
@@ -42,6 +42,7 @@
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/ir/transform",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/spirv",
     "//src/tint/lang/spirv/intrinsic/data",
     "//src/tint/lang/spirv/ir",
     "//src/tint/lang/wgsl",
@@ -113,6 +114,7 @@
     "//src/tint/lang/core/intrinsic/data",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/spirv",
     "//src/tint/lang/spirv/intrinsic/data",
     "//src/tint/lang/spirv/ir",
     "//src/tint/utils/containers",
diff --git a/src/tint/lang/spirv/writer/BUILD.cmake b/src/tint/lang/spirv/writer/BUILD.cmake
index b47843a..d62c4a1 100644
--- a/src/tint/lang/spirv/writer/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/BUILD.cmake
@@ -49,6 +49,7 @@
   tint_lang_core_ir
   tint_lang_core_ir_transform
   tint_lang_core_type
+  tint_lang_spirv
   tint_lang_spirv_intrinsic_data
   tint_lang_spirv_ir
   tint_lang_wgsl
@@ -125,6 +126,7 @@
   tint_lang_core_intrinsic_data
   tint_lang_core_ir
   tint_lang_core_type
+  tint_lang_spirv
   tint_lang_spirv_intrinsic_data
   tint_lang_spirv_ir
   tint_utils_containers
diff --git a/src/tint/lang/spirv/writer/BUILD.gn b/src/tint/lang/spirv/writer/BUILD.gn
index a3dd0b8..a7dd432 100644
--- a/src/tint/lang/spirv/writer/BUILD.gn
+++ b/src/tint/lang/spirv/writer/BUILD.gn
@@ -45,6 +45,7 @@
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/ir/transform",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/spirv",
       "${tint_src_dir}/lang/spirv/intrinsic/data",
       "${tint_src_dir}/lang/spirv/ir",
       "${tint_src_dir}/lang/wgsl",
@@ -117,6 +118,7 @@
         "${tint_src_dir}/lang/core/intrinsic/data",
         "${tint_src_dir}/lang/core/ir",
         "${tint_src_dir}/lang/core/type",
+        "${tint_src_dir}/lang/spirv",
         "${tint_src_dir}/lang/spirv/intrinsic/data",
         "${tint_src_dir}/lang/spirv/ir",
         "${tint_src_dir}/utils/containers",
diff --git a/src/tint/lang/spirv/writer/common/BUILD.bazel b/src/tint/lang/spirv/writer/common/BUILD.bazel
index db94b5b..679753a 100644
--- a/src/tint/lang/spirv/writer/common/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/common/BUILD.bazel
@@ -79,6 +79,7 @@
     "//src/tint/lang/core/intrinsic/data",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/spirv",
     "//src/tint/lang/spirv/intrinsic/data",
     "//src/tint/lang/spirv/ir",
     "//src/tint/utils/containers",
diff --git a/src/tint/lang/spirv/writer/common/BUILD.cmake b/src/tint/lang/spirv/writer/common/BUILD.cmake
index 9a74b57..8e00115 100644
--- a/src/tint/lang/spirv/writer/common/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/common/BUILD.cmake
@@ -84,6 +84,7 @@
   tint_lang_core_intrinsic_data
   tint_lang_core_ir
   tint_lang_core_type
+  tint_lang_spirv
   tint_lang_spirv_intrinsic_data
   tint_lang_spirv_ir
   tint_utils_containers
diff --git a/src/tint/lang/spirv/writer/common/BUILD.gn b/src/tint/lang/spirv/writer/common/BUILD.gn
index c15d605..17330ef 100644
--- a/src/tint/lang/spirv/writer/common/BUILD.gn
+++ b/src/tint/lang/spirv/writer/common/BUILD.gn
@@ -82,6 +82,7 @@
         "${tint_src_dir}/lang/core/intrinsic/data",
         "${tint_src_dir}/lang/core/ir",
         "${tint_src_dir}/lang/core/type",
+        "${tint_src_dir}/lang/spirv",
         "${tint_src_dir}/lang/spirv/intrinsic/data",
         "${tint_src_dir}/lang/spirv/ir",
         "${tint_src_dir}/utils/containers",
diff --git a/src/tint/lang/spirv/writer/printer/BUILD.bazel b/src/tint/lang/spirv/writer/printer/BUILD.bazel
index 672fdad..6cbbbbe 100644
--- a/src/tint/lang/spirv/writer/printer/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/printer/BUILD.bazel
@@ -40,6 +40,7 @@
     "//src/tint/lang/core/intrinsic/data",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/spirv",
     "//src/tint/lang/spirv/intrinsic/data",
     "//src/tint/lang/spirv/ir",
     "//src/tint/lang/spirv/type",
diff --git a/src/tint/lang/spirv/writer/printer/BUILD.cmake b/src/tint/lang/spirv/writer/printer/BUILD.cmake
index e296599..2eccda6 100644
--- a/src/tint/lang/spirv/writer/printer/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/printer/BUILD.cmake
@@ -41,6 +41,7 @@
   tint_lang_core_intrinsic_data
   tint_lang_core_ir
   tint_lang_core_type
+  tint_lang_spirv
   tint_lang_spirv_intrinsic_data
   tint_lang_spirv_ir
   tint_lang_spirv_type
diff --git a/src/tint/lang/spirv/writer/printer/BUILD.gn b/src/tint/lang/spirv/writer/printer/BUILD.gn
index fd1dd71..69b21cd 100644
--- a/src/tint/lang/spirv/writer/printer/BUILD.gn
+++ b/src/tint/lang/spirv/writer/printer/BUILD.gn
@@ -39,6 +39,7 @@
       "${tint_src_dir}/lang/core/intrinsic/data",
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/spirv",
       "${tint_src_dir}/lang/spirv/intrinsic/data",
       "${tint_src_dir}/lang/spirv/ir",
       "${tint_src_dir}/lang/spirv/type",
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index 33da5de..adb6815 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -1036,93 +1036,93 @@
 
     spv::Op op = spv::Op::Max;
     switch (builtin->Func()) {
-        case spirv::ir::Function::kArrayLength:
+        case spirv::BuiltinFn::kArrayLength:
             op = spv::Op::OpArrayLength;
             break;
-        case spirv::ir::Function::kAtomicIadd:
+        case spirv::BuiltinFn::kAtomicIadd:
             op = spv::Op::OpAtomicIAdd;
             break;
-        case spirv::ir::Function::kAtomicIsub:
+        case spirv::BuiltinFn::kAtomicIsub:
             op = spv::Op::OpAtomicISub;
             break;
-        case spirv::ir::Function::kAtomicAnd:
+        case spirv::BuiltinFn::kAtomicAnd:
             op = spv::Op::OpAtomicAnd;
             break;
-        case spirv::ir::Function::kAtomicCompareExchange:
+        case spirv::BuiltinFn::kAtomicCompareExchange:
             op = spv::Op::OpAtomicCompareExchange;
             break;
-        case spirv::ir::Function::kAtomicExchange:
+        case spirv::BuiltinFn::kAtomicExchange:
             op = spv::Op::OpAtomicExchange;
             break;
-        case spirv::ir::Function::kAtomicLoad:
+        case spirv::BuiltinFn::kAtomicLoad:
             op = spv::Op::OpAtomicLoad;
             break;
-        case spirv::ir::Function::kAtomicOr:
+        case spirv::BuiltinFn::kAtomicOr:
             op = spv::Op::OpAtomicOr;
             break;
-        case spirv::ir::Function::kAtomicSmax:
+        case spirv::BuiltinFn::kAtomicSmax:
             op = spv::Op::OpAtomicSMax;
             break;
-        case spirv::ir::Function::kAtomicSmin:
+        case spirv::BuiltinFn::kAtomicSmin:
             op = spv::Op::OpAtomicSMin;
             break;
-        case spirv::ir::Function::kAtomicStore:
+        case spirv::BuiltinFn::kAtomicStore:
             op = spv::Op::OpAtomicStore;
             break;
-        case spirv::ir::Function::kAtomicUmax:
+        case spirv::BuiltinFn::kAtomicUmax:
             op = spv::Op::OpAtomicUMax;
             break;
-        case spirv::ir::Function::kAtomicUmin:
+        case spirv::BuiltinFn::kAtomicUmin:
             op = spv::Op::OpAtomicUMin;
             break;
-        case spirv::ir::Function::kAtomicXor:
+        case spirv::BuiltinFn::kAtomicXor:
             op = spv::Op::OpAtomicXor;
             break;
-        case spirv::ir::Function::kDot:
+        case spirv::BuiltinFn::kDot:
             op = spv::Op::OpDot;
             break;
-        case spirv::ir::Function::kImageDrefGather:
+        case spirv::BuiltinFn::kImageDrefGather:
             op = spv::Op::OpImageDrefGather;
             break;
-        case spirv::ir::Function::kImageFetch:
+        case spirv::BuiltinFn::kImageFetch:
             op = spv::Op::OpImageFetch;
             break;
-        case spirv::ir::Function::kImageGather:
+        case spirv::BuiltinFn::kImageGather:
             op = spv::Op::OpImageGather;
             break;
-        case spirv::ir::Function::kImageQuerySize:
+        case spirv::BuiltinFn::kImageQuerySize:
             module_.PushCapability(SpvCapabilityImageQuery);
             op = spv::Op::OpImageQuerySize;
             break;
-        case spirv::ir::Function::kImageQuerySizeLod:
+        case spirv::BuiltinFn::kImageQuerySizeLod:
             module_.PushCapability(SpvCapabilityImageQuery);
             op = spv::Op::OpImageQuerySizeLod;
             break;
-        case spirv::ir::Function::kImageRead:
+        case spirv::BuiltinFn::kImageRead:
             op = spv::Op::OpImageRead;
             break;
-        case spirv::ir::Function::kMatrixTimesMatrix:
+        case spirv::BuiltinFn::kMatrixTimesMatrix:
             op = spv::Op::OpMatrixTimesMatrix;
             break;
-        case spirv::ir::Function::kMatrixTimesScalar:
+        case spirv::BuiltinFn::kMatrixTimesScalar:
             op = spv::Op::OpMatrixTimesScalar;
             break;
-        case spirv::ir::Function::kMatrixTimesVector:
+        case spirv::BuiltinFn::kMatrixTimesVector:
             op = spv::Op::OpMatrixTimesVector;
             break;
-        case spirv::ir::Function::kSampledImage:
+        case spirv::BuiltinFn::kSampledImage:
             op = spv::Op::OpSampledImage;
             break;
-        case spirv::ir::Function::kSelect:
+        case spirv::BuiltinFn::kSelect:
             op = spv::Op::OpSelect;
             break;
-        case spirv::ir::Function::kVectorTimesMatrix:
+        case spirv::BuiltinFn::kVectorTimesMatrix:
             op = spv::Op::OpVectorTimesMatrix;
             break;
-        case spirv::ir::Function::kVectorTimesScalar:
+        case spirv::BuiltinFn::kVectorTimesScalar:
             op = spv::Op::OpVectorTimesScalar;
             break;
-        case spirv::ir::Function::kNone:
+        case spirv::BuiltinFn::kNone:
             TINT_ICE() << "undefined spirv ir function";
             return;
     }
diff --git a/src/tint/lang/spirv/writer/raise/BUILD.bazel b/src/tint/lang/spirv/writer/raise/BUILD.bazel
index 2f3e484..6c76444 100644
--- a/src/tint/lang/spirv/writer/raise/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/raise/BUILD.bazel
@@ -53,6 +53,7 @@
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/ir/transform",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/spirv",
     "//src/tint/lang/spirv/intrinsic/data",
     "//src/tint/lang/spirv/ir",
     "//src/tint/lang/spirv/type",
diff --git a/src/tint/lang/spirv/writer/raise/BUILD.cmake b/src/tint/lang/spirv/writer/raise/BUILD.cmake
index 5462889..7e56366 100644
--- a/src/tint/lang/spirv/writer/raise/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/raise/BUILD.cmake
@@ -54,6 +54,7 @@
   tint_lang_core_ir
   tint_lang_core_ir_transform
   tint_lang_core_type
+  tint_lang_spirv
   tint_lang_spirv_intrinsic_data
   tint_lang_spirv_ir
   tint_lang_spirv_type
diff --git a/src/tint/lang/spirv/writer/raise/BUILD.gn b/src/tint/lang/spirv/writer/raise/BUILD.gn
index b62e46f..db76051 100644
--- a/src/tint/lang/spirv/writer/raise/BUILD.gn
+++ b/src/tint/lang/spirv/writer/raise/BUILD.gn
@@ -56,6 +56,7 @@
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/ir/transform",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/spirv",
       "${tint_src_dir}/lang/spirv/intrinsic/data",
       "${tint_src_dir}/lang/spirv/ir",
       "${tint_src_dir}/lang/spirv/type",
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc b/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
index c42146e..4cd2cbe 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
@@ -196,7 +196,7 @@
 
         // Replace the builtin call with a call to the spirv.array_length intrinsic.
         auto* call = b.Call<spirv::ir::BuiltinCall>(
-            builtin->Result()->Type(), spirv::ir::Function::kArrayLength,
+            builtin->Result()->Type(), spirv::BuiltinFn::kArrayLength,
             Vector{access->Object(), Literal(u32(const_idx->Value()->ValueAs<uint32_t>()))});
         call->InsertBefore(builtin);
         return call->Result();
@@ -223,8 +223,8 @@
         auto* memory_semantics = b.Constant(u32(SpvMemorySemanticsMaskNone));
 
         // Helper to build the builtin call with the common operands.
-        auto build = [&](const core::type::Type* type, enum spirv::ir::Function intrinsic) {
-            return b.Call<spirv::ir::BuiltinCall>(type, intrinsic, pointer, memory,
+        auto build = [&](const core::type::Type* type, enum spirv::BuiltinFn builtin_fn) {
+            return b.Call<spirv::ir::BuiltinCall>(type, builtin_fn, pointer, memory,
                                                   memory_semantics);
         };
 
@@ -232,18 +232,18 @@
         core::ir::Call* call = nullptr;
         switch (builtin->Func()) {
             case core::BuiltinFn::kAtomicAdd:
-                call = build(result_ty, spirv::ir::Function::kAtomicIadd);
+                call = build(result_ty, spirv::BuiltinFn::kAtomicIadd);
                 call->AppendArg(builtin->Args()[1]);
                 break;
             case core::BuiltinFn::kAtomicAnd:
-                call = build(result_ty, spirv::ir::Function::kAtomicAnd);
+                call = build(result_ty, spirv::BuiltinFn::kAtomicAnd);
                 call->AppendArg(builtin->Args()[1]);
                 break;
             case core::BuiltinFn::kAtomicCompareExchangeWeak: {
                 auto* cmp = builtin->Args()[1];
                 auto* value = builtin->Args()[2];
                 auto* int_ty = value->Type();
-                call = build(int_ty, spirv::ir::Function::kAtomicCompareExchange);
+                call = build(int_ty, spirv::BuiltinFn::kAtomicCompareExchange);
                 call->AppendArg(memory_semantics);
                 call->AppendArg(value);
                 call->AppendArg(cmp);
@@ -261,42 +261,42 @@
                 break;
             }
             case core::BuiltinFn::kAtomicExchange:
-                call = build(result_ty, spirv::ir::Function::kAtomicExchange);
+                call = build(result_ty, spirv::BuiltinFn::kAtomicExchange);
                 call->AppendArg(builtin->Args()[1]);
                 break;
             case core::BuiltinFn::kAtomicLoad:
-                call = build(result_ty, spirv::ir::Function::kAtomicLoad);
+                call = build(result_ty, spirv::BuiltinFn::kAtomicLoad);
                 break;
             case core::BuiltinFn::kAtomicOr:
-                call = build(result_ty, spirv::ir::Function::kAtomicOr);
+                call = build(result_ty, spirv::BuiltinFn::kAtomicOr);
                 call->AppendArg(builtin->Args()[1]);
                 break;
             case core::BuiltinFn::kAtomicMax:
                 if (result_ty->is_signed_integer_scalar()) {
-                    call = build(result_ty, spirv::ir::Function::kAtomicSmax);
+                    call = build(result_ty, spirv::BuiltinFn::kAtomicSmax);
                 } else {
-                    call = build(result_ty, spirv::ir::Function::kAtomicUmax);
+                    call = build(result_ty, spirv::BuiltinFn::kAtomicUmax);
                 }
                 call->AppendArg(builtin->Args()[1]);
                 break;
             case core::BuiltinFn::kAtomicMin:
                 if (result_ty->is_signed_integer_scalar()) {
-                    call = build(result_ty, spirv::ir::Function::kAtomicSmin);
+                    call = build(result_ty, spirv::BuiltinFn::kAtomicSmin);
                 } else {
-                    call = build(result_ty, spirv::ir::Function::kAtomicUmin);
+                    call = build(result_ty, spirv::BuiltinFn::kAtomicUmin);
                 }
                 call->AppendArg(builtin->Args()[1]);
                 break;
             case core::BuiltinFn::kAtomicStore:
-                call = build(result_ty, spirv::ir::Function::kAtomicStore);
+                call = build(result_ty, spirv::BuiltinFn::kAtomicStore);
                 call->AppendArg(builtin->Args()[1]);
                 break;
             case core::BuiltinFn::kAtomicSub:
-                call = build(result_ty, spirv::ir::Function::kAtomicIsub);
+                call = build(result_ty, spirv::BuiltinFn::kAtomicIsub);
                 call->AppendArg(builtin->Args()[1]);
                 break;
             case core::BuiltinFn::kAtomicXor:
-                call = build(result_ty, spirv::ir::Function::kAtomicXor);
+                call = build(result_ty, spirv::BuiltinFn::kAtomicXor);
                 call->AppendArg(builtin->Args()[1]);
                 break;
             default:
@@ -338,7 +338,7 @@
         // Replace the builtin call with a call to the spirv.dot intrinsic.
         auto args = Vector<core::ir::Value*, 4>(builtin->Args());
         auto* call = b.Call<spirv::ir::BuiltinCall>(builtin->Result()->Type(),
-                                                    spirv::ir::Function::kDot, std::move(args));
+                                                    spirv::BuiltinFn::kDot, std::move(args));
         call->InsertBefore(builtin);
         return call->Result();
     }
@@ -369,7 +369,7 @@
 
         // Replace the builtin call with a call to the spirv.select intrinsic.
         auto* call = b.Call<spirv::ir::BuiltinCall>(builtin->Result()->Type(),
-                                                    spirv::ir::Function::kSelect, std::move(args));
+                                                    spirv::BuiltinFn::kSelect, std::move(args));
         call->InsertBefore(builtin);
         return call->Result();
     }
@@ -480,7 +480,7 @@
 
         // Use OpSampledImage to create an OpTypeSampledImage object.
         auto* sampled_image = b.Call<spirv::ir::BuiltinCall>(ty.Get<type::SampledImage>(texture_ty),
-                                                             spirv::ir::Function::kSampledImage,
+                                                             spirv::BuiltinFn::kSampledImage,
                                                              Vector{texture, sampler});
         sampled_image->InsertBefore(builtin);
 
@@ -588,7 +588,7 @@
 
         // Use OpSampledImage to create an OpTypeSampledImage object.
         auto* sampled_image = b.Call<spirv::ir::BuiltinCall>(ty.Get<type::SampledImage>(texture_ty),
-                                                             spirv::ir::Function::kSampledImage,
+                                                             spirv::BuiltinFn::kSampledImage,
                                                              Vector{texture, sampler});
         sampled_image->InsertBefore(builtin);
 
@@ -599,16 +599,16 @@
         }
 
         // Determine which SPIR-V function to use and which optional image operands are needed.
-        enum spirv::ir::Function function;
+        enum spirv::BuiltinFn function;
         core::ir::Value* depth = nullptr;
         ImageOperands operands;
         switch (builtin->Func()) {
             case core::BuiltinFn::kTextureGather:
-                function = spirv::ir::Function::kImageGather;
+                function = spirv::BuiltinFn::kImageGather;
                 operands.offset = next_arg();
                 break;
             case core::BuiltinFn::kTextureGatherCompare:
-                function = spirv::ir::Function::kImageDrefGather;
+                function = spirv::BuiltinFn::kImageDrefGather;
                 depth = next_arg();
                 operands.offset = next_arg();
                 break;
@@ -682,8 +682,8 @@
         if (expects_scalar_result) {
             result_ty = ty.vec4(result_ty);
         }
-        auto kind = texture_ty->Is<core::type::StorageTexture>() ? spirv::ir::Function::kImageRead
-                                                                 : spirv::ir::Function::kImageFetch;
+        auto kind = texture_ty->Is<core::type::StorageTexture>() ? spirv::BuiltinFn::kImageRead
+                                                                 : spirv::BuiltinFn::kImageFetch;
         auto* texture_call =
             b.Call<spirv::ir::BuiltinCall>(result_ty, kind, std::move(builtin_args));
         texture_call->InsertBefore(builtin);
@@ -755,13 +755,13 @@
         function_args.Push(texture);
 
         // Determine which SPIR-V function to use, and add the Lod argument if needed.
-        enum spirv::ir::Function function;
+        enum spirv::BuiltinFn function;
         if (texture_ty
                 ->IsAnyOf<core::type::MultisampledTexture, core::type::DepthMultisampledTexture,
                           core::type::StorageTexture>()) {
-            function = spirv::ir::Function::kImageQuerySize;
+            function = spirv::BuiltinFn::kImageQuerySize;
         } else {
-            function = spirv::ir::Function::kImageQuerySizeLod;
+            function = spirv::BuiltinFn::kImageQuerySizeLod;
             if (auto* lod = next_arg()) {
                 function_args.Push(lod);
             } else {
@@ -805,13 +805,13 @@
         function_args.Push(texture);
 
         // Determine which SPIR-V function to use, and add the Lod argument if needed.
-        enum spirv::ir::Function function;
+        enum spirv::BuiltinFn function;
         if (texture_ty
                 ->IsAnyOf<core::type::MultisampledTexture, core::type::DepthMultisampledTexture,
                           core::type::StorageTexture>()) {
-            function = spirv::ir::Function::kImageQuerySize;
+            function = spirv::BuiltinFn::kImageQuerySize;
         } else {
-            function = spirv::ir::Function::kImageQuerySizeLod;
+            function = spirv::BuiltinFn::kImageQuerySizeLod;
             function_args.Push(b.Constant(0_u));
         }
 
diff --git a/src/tint/lang/spirv/writer/raise/expand_implicit_splats.cc b/src/tint/lang/spirv/writer/raise/expand_implicit_splats.cc
index cedf944..775bf53 100644
--- a/src/tint/lang/spirv/writer/raise/expand_implicit_splats.cc
+++ b/src/tint/lang/spirv/writer/raise/expand_implicit_splats.cc
@@ -19,8 +19,8 @@
 #include "src/tint/lang/core/ir/builder.h"
 #include "src/tint/lang/core/ir/module.h"
 #include "src/tint/lang/core/ir/validator.h"
+#include "src/tint/lang/spirv/builtin_fn.h"
 #include "src/tint/lang/spirv/ir/builtin_call.h"
-#include "src/tint/lang/spirv/ir/function.h"
 
 using namespace tint::core::number_suffixes;  // NOLINT
 
@@ -91,7 +91,7 @@
         if (result_ty->is_float_vector() && binary->Kind() == core::ir::Binary::Kind::kMultiply) {
             // Use OpVectorTimesScalar for floating point multiply.
             auto* vts =
-                b.Call<spirv::ir::BuiltinCall>(result_ty, spirv::ir::Function::kVectorTimesScalar);
+                b.Call<spirv::ir::BuiltinCall>(result_ty, spirv::BuiltinFn::kVectorTimesScalar);
             if (binary->LHS()->Type()->Is<core::type::Scalar>()) {
                 vts->AppendArg(binary->RHS());
                 vts->AppendArg(binary->LHS());
diff --git a/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic.cc b/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic.cc
index 0a5dd30..30322ec 100644
--- a/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic.cc
+++ b/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic.cc
@@ -99,21 +99,21 @@
                 if (lhs_ty->Is<core::type::Matrix>()) {
                     if (rhs_ty->Is<core::type::Scalar>()) {
                         replace(b.Call<spirv::ir::BuiltinCall>(
-                            ty, spirv::ir::Function::kMatrixTimesScalar, lhs, rhs));
+                            ty, spirv::BuiltinFn::kMatrixTimesScalar, lhs, rhs));
                     } else if (rhs_ty->Is<core::type::Vector>()) {
                         replace(b.Call<spirv::ir::BuiltinCall>(
-                            ty, spirv::ir::Function::kMatrixTimesVector, lhs, rhs));
+                            ty, spirv::BuiltinFn::kMatrixTimesVector, lhs, rhs));
                     } else if (rhs_ty->Is<core::type::Matrix>()) {
                         replace(b.Call<spirv::ir::BuiltinCall>(
-                            ty, spirv::ir::Function::kMatrixTimesMatrix, lhs, rhs));
+                            ty, spirv::BuiltinFn::kMatrixTimesMatrix, lhs, rhs));
                     }
                 } else {
                     if (lhs_ty->Is<core::type::Scalar>()) {
                         replace(b.Call<spirv::ir::BuiltinCall>(
-                            ty, spirv::ir::Function::kMatrixTimesScalar, rhs, lhs));
+                            ty, spirv::BuiltinFn::kMatrixTimesScalar, rhs, lhs));
                     } else if (lhs_ty->Is<core::type::Vector>()) {
                         replace(b.Call<spirv::ir::BuiltinCall>(
-                            ty, spirv::ir::Function::kVectorTimesMatrix, lhs, rhs));
+                            ty, spirv::BuiltinFn::kVectorTimesMatrix, lhs, rhs));
                     }
                 }
                 break;