[ir][msl] Run existing transforms which are required.

Run the currently existing transforms which are used by the MSL backend.

Bug: tint:1967
Change-Id: I2c13de1f1fb08659d340774f695a760c54d97b5d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/162941
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/lang/msl/writer/BUILD.bazel b/src/tint/lang/msl/writer/BUILD.bazel
index f57979e..2242175 100644
--- a/src/tint/lang/msl/writer/BUILD.bazel
+++ b/src/tint/lang/msl/writer/BUILD.bazel
@@ -53,7 +53,6 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
-    "//src/tint/lang/msl/writer/raise",
     "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
@@ -78,6 +77,7 @@
       "//src/tint/lang/msl/writer/ast_printer",
       "//src/tint/lang/msl/writer/common",
       "//src/tint/lang/msl/writer/printer",
+      "//src/tint/lang/msl/writer/raise",
     ],
     "//conditions:default": [],
   }) + select({
diff --git a/src/tint/lang/msl/writer/BUILD.cmake b/src/tint/lang/msl/writer/BUILD.cmake
index 243f93b..e4d4395 100644
--- a/src/tint/lang/msl/writer/BUILD.cmake
+++ b/src/tint/lang/msl/writer/BUILD.cmake
@@ -61,7 +61,6 @@
   tint_lang_core_constant
   tint_lang_core_ir
   tint_lang_core_type
-  tint_lang_msl_writer_raise
   tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
@@ -88,6 +87,7 @@
     tint_lang_msl_writer_ast_printer
     tint_lang_msl_writer_common
     tint_lang_msl_writer_printer
+    tint_lang_msl_writer_raise
   )
 endif(TINT_BUILD_MSL_WRITER)
 
diff --git a/src/tint/lang/msl/writer/BUILD.gn b/src/tint/lang/msl/writer/BUILD.gn
index 2b379e5c..f15a5dc 100644
--- a/src/tint/lang/msl/writer/BUILD.gn
+++ b/src/tint/lang/msl/writer/BUILD.gn
@@ -56,7 +56,6 @@
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/type",
-      "${tint_src_dir}/lang/msl/writer/raise",
       "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
@@ -83,6 +82,7 @@
         "${tint_src_dir}/lang/msl/writer/ast_printer",
         "${tint_src_dir}/lang/msl/writer/common",
         "${tint_src_dir}/lang/msl/writer/printer",
+        "${tint_src_dir}/lang/msl/writer/raise",
       ]
     }
 
diff --git a/src/tint/lang/msl/writer/printer/BUILD.bazel b/src/tint/lang/msl/writer/printer/BUILD.bazel
index fbb8bfc..7de0377 100644
--- a/src/tint/lang/msl/writer/printer/BUILD.bazel
+++ b/src/tint/lang/msl/writer/printer/BUILD.bazel
@@ -91,12 +91,12 @@
   ],
   deps = [
     "//src/tint/api/common",
+    "//src/tint/api/options",
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
-    "//src/tint/lang/msl/writer/raise",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
     "//src/tint/utils/ice",
@@ -113,7 +113,9 @@
     "@gtest",
   ] + select({
     ":tint_build_msl_writer": [
+      "//src/tint/lang/msl/writer/common",
       "//src/tint/lang/msl/writer/printer",
+      "//src/tint/lang/msl/writer/raise",
     ],
     "//conditions:default": [],
   }),
diff --git a/src/tint/lang/msl/writer/printer/BUILD.cmake b/src/tint/lang/msl/writer/printer/BUILD.cmake
index bb0db69..37d0fcb 100644
--- a/src/tint/lang/msl/writer/printer/BUILD.cmake
+++ b/src/tint/lang/msl/writer/printer/BUILD.cmake
@@ -96,12 +96,12 @@
 
 tint_target_add_dependencies(tint_lang_msl_writer_printer_test test
   tint_api_common
+  tint_api_options
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_intrinsic
   tint_lang_core_ir
   tint_lang_core_type
-  tint_lang_msl_writer_raise
   tint_utils_containers
   tint_utils_diagnostic
   tint_utils_ice
@@ -123,7 +123,9 @@
 
 if(TINT_BUILD_MSL_WRITER)
   tint_target_add_dependencies(tint_lang_msl_writer_printer_test test
+    tint_lang_msl_writer_common
     tint_lang_msl_writer_printer
+    tint_lang_msl_writer_raise
   )
 endif(TINT_BUILD_MSL_WRITER)
 
diff --git a/src/tint/lang/msl/writer/printer/BUILD.gn b/src/tint/lang/msl/writer/printer/BUILD.gn
index bcadb87..ce460cc 100644
--- a/src/tint/lang/msl/writer/printer/BUILD.gn
+++ b/src/tint/lang/msl/writer/printer/BUILD.gn
@@ -93,12 +93,12 @@
       deps = [
         "${tint_src_dir}:gmock_and_gtest",
         "${tint_src_dir}/api/common",
+        "${tint_src_dir}/api/options",
         "${tint_src_dir}/lang/core",
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/intrinsic",
         "${tint_src_dir}/lang/core/ir",
         "${tint_src_dir}/lang/core/type",
-        "${tint_src_dir}/lang/msl/writer/raise",
         "${tint_src_dir}/utils/containers",
         "${tint_src_dir}/utils/diagnostic",
         "${tint_src_dir}/utils/ice",
@@ -115,7 +115,11 @@
       ]
 
       if (tint_build_msl_writer) {
-        deps += [ "${tint_src_dir}/lang/msl/writer/printer" ]
+        deps += [
+          "${tint_src_dir}/lang/msl/writer/common",
+          "${tint_src_dir}/lang/msl/writer/printer",
+          "${tint_src_dir}/lang/msl/writer/raise",
+        ]
       }
     }
   }
diff --git a/src/tint/lang/msl/writer/printer/binary_test.cc b/src/tint/lang/msl/writer/printer/binary_test.cc
index 8f87403..acc59b1 100644
--- a/src/tint/lang/msl/writer/printer/binary_test.cc
+++ b/src/tint/lang/msl/writer/printer/binary_test.cc
@@ -76,13 +76,95 @@
     testing::Values(BinaryData{"(left + right)", core::ir::BinaryOp::kAdd},
                     BinaryData{"(left - right)", core::ir::BinaryOp::kSubtract},
                     BinaryData{"(left * right)", core::ir::BinaryOp::kMultiply},
-                    BinaryData{"(left / right)", core::ir::BinaryOp::kDivide},
-                    BinaryData{"(left % right)", core::ir::BinaryOp::kModulo},
                     BinaryData{"(left & right)", core::ir::BinaryOp::kAnd},
                     BinaryData{"(left | right)", core::ir::BinaryOp::kOr},
-                    BinaryData{"(left ^ right)", core::ir::BinaryOp::kXor},
-                    BinaryData{"(left << right)", core::ir::BinaryOp::kShiftLeft},
-                    BinaryData{"(left >> right)", core::ir::BinaryOp::kShiftRight}));
+                    BinaryData{"(left ^ right)", core::ir::BinaryOp::kXor}));
+
+TEST_F(MslPrinterTest, BinaryDivU32) {
+    auto* func = b.Function("foo", ty.void_());
+    b.Append(func->Block(), [&] {
+        auto* l = b.Let("left", b.Constant(1_u));
+        auto* r = b.Let("right", b.Constant(2_u));
+        auto* bin = b.Binary(core::ir::BinaryOp::kDivide, ty.u32(), l, r);
+        b.Let("val", bin);
+        b.Return(func);
+    });
+
+    ASSERT_TRUE(Generate()) << err_ << output_;
+    EXPECT_EQ(output_, MetalHeader() + R"(
+void foo() {
+  uint const left = 1u;
+  uint const right = 2u;
+  uint const val = tint_div_u32(left, right);
+}
+uint tint_div_u32(uint lhs, uint rhs) {
+  return (lhs / select(rhs, 1u, (rhs == 0u)));
+}
+)");
+}
+
+TEST_F(MslPrinterTest, BinaryModU32) {
+    auto* func = b.Function("foo", ty.void_());
+    b.Append(func->Block(), [&] {
+        auto* l = b.Let("left", b.Constant(1_u));
+        auto* r = b.Let("right", b.Constant(2_u));
+        auto* bin = b.Binary(core::ir::BinaryOp::kModulo, ty.u32(), l, r);
+        b.Let("val", bin);
+        b.Return(func);
+    });
+
+    ASSERT_TRUE(Generate()) << err_ << output_;
+    EXPECT_EQ(output_, MetalHeader() + R"(
+void foo() {
+  uint const left = 1u;
+  uint const right = 2u;
+  uint const val = tint_mod_u32(left, right);
+}
+uint tint_mod_u32(uint lhs, uint rhs) {
+  return (lhs - ((lhs / select(rhs, 1u, (rhs == 0u))) * select(rhs, 1u, (rhs == 0u))));
+}
+)");
+}
+
+TEST_F(MslPrinterTest, BinaryShiftLeft) {
+    auto* func = b.Function("foo", ty.void_());
+    b.Append(func->Block(), [&] {
+        auto* l = b.Let("left", b.Constant(1_u));
+        auto* r = b.Let("right", b.Constant(2_u));
+        auto* bin = b.Binary(core::ir::BinaryOp::kShiftLeft, ty.u32(), l, r);
+        b.Let("val", bin);
+        b.Return(func);
+    });
+
+    ASSERT_TRUE(Generate()) << err_ << output_;
+    EXPECT_EQ(output_, MetalHeader() + R"(
+void foo() {
+  uint const left = 1u;
+  uint const right = 2u;
+  uint const val = (left << (right & 31u));
+}
+)");
+}
+
+TEST_F(MslPrinterTest, BinaryShiftRight) {
+    auto* func = b.Function("foo", ty.void_());
+    b.Append(func->Block(), [&] {
+        auto* l = b.Let("left", b.Constant(1_u));
+        auto* r = b.Let("right", b.Constant(2_u));
+        auto* bin = b.Binary(core::ir::BinaryOp::kShiftRight, ty.u32(), l, r);
+        b.Let("val", bin);
+        b.Return(func);
+    });
+
+    ASSERT_TRUE(Generate()) << err_ << output_;
+    EXPECT_EQ(output_, MetalHeader() + R"(
+void foo() {
+  uint const left = 1u;
+  uint const right = 2u;
+  uint const val = (left >> (right & 31u));
+}
+)");
+}
 
 using MslPrinterBinaryBoolTest = MslPrinterTestWithParam<BinaryData>;
 TEST_P(MslPrinterBinaryBoolTest, Emit) {
diff --git a/src/tint/lang/msl/writer/printer/discard_test.cc b/src/tint/lang/msl/writer/printer/discard_test.cc
index e85ad57..64451a3 100644
--- a/src/tint/lang/msl/writer/printer/discard_test.cc
+++ b/src/tint/lang/msl/writer/printer/discard_test.cc
@@ -43,10 +43,24 @@
         b.Return(func);
     });
 
+    auto* ep = b.Function("main", ty.void_());
+    ep->SetStage(core::ir::Function::PipelineStage::kFragment);
+    b.Append(ep->Block(), [&] {
+        b.Call(func);
+        b.Return(ep);
+    });
+
     ASSERT_TRUE(Generate()) << err_ << output_;
     EXPECT_EQ(output_, MetalHeader() + R"(
+thread bool continue_execution = true;
 void foo() {
   if (true) {
+    continue_execution = false;
+  }
+}
+fragment void main() {
+  foo();
+  if (!(continue_execution)) {
     discard_fragment();
   }
 }
diff --git a/src/tint/lang/msl/writer/printer/helper_test.h b/src/tint/lang/msl/writer/printer/helper_test.h
index f77774b..bf14aa6 100644
--- a/src/tint/lang/msl/writer/printer/helper_test.h
+++ b/src/tint/lang/msl/writer/printer/helper_test.h
@@ -80,7 +80,7 @@
     /// Run the writer on the IR module and validate the result.
     /// @returns true if generation and validation succeeded
     bool Generate() {
-        if (auto raised = raise::Raise(mod); !raised) {
+        if (auto raised = raise::Raise(mod, {}); !raised) {
             err_ = raised.Failure().reason.str();
             return false;
         }
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index 2440bcd..1c2f33f 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -59,6 +59,7 @@
 #include "src/tint/lang/core/ir/store_vector_element.h"
 #include "src/tint/lang/core/ir/switch.h"
 #include "src/tint/lang/core/ir/swizzle.h"
+#include "src/tint/lang/core/ir/terminate_invocation.h"
 #include "src/tint/lang/core/ir/unreachable.h"
 #include "src/tint/lang/core/ir/user_call.h"
 #include "src/tint/lang/core/ir/validator.h"
@@ -326,7 +327,7 @@
                 [&](core::ir::Return* r) { EmitReturn(r); },                          //
                 [&](core::ir::Unreachable*) { EmitUnreachable(); },                   //
                 [&](core::ir::Var* v) { EmitVar(v); },                                //
-                [&](core::ir::Discard*) { EmitDiscard(); },                           //
+                [&](core::ir::TerminateInvocation*) { EmitDiscard(); },               //
                 [&](core::ir::Store* s) { EmitStore(s); },                            //
                 [&](core::ir::Continue*) { EmitContinue(); },                         //
                 [&](core::ir::NextIteration*) { /* do nothing */ },                   //
diff --git a/src/tint/lang/msl/writer/raise/BUILD.bazel b/src/tint/lang/msl/writer/raise/BUILD.bazel
index ab458ab..a192956 100644
--- a/src/tint/lang/msl/writer/raise/BUILD.bazel
+++ b/src/tint/lang/msl/writer/raise/BUILD.bazel
@@ -45,18 +45,32 @@
     "raise.h",
   ],
   deps = [
+    "//src/tint/api/common",
+    "//src/tint/api/options",
+    "//src/tint/lang/core/ir/transform",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
     "//src/tint/utils/ice",
     "//src/tint/utils/macros",
     "//src/tint/utils/math",
     "//src/tint/utils/memory",
+    "//src/tint/utils/reflection",
     "//src/tint/utils/result",
     "//src/tint/utils/rtti",
     "//src/tint/utils/text",
     "//src/tint/utils/traits",
-  ],
+  ] + select({
+    ":tint_build_msl_writer": [
+      "//src/tint/lang/msl/writer/common",
+    ],
+    "//conditions:default": [],
+  }),
   copts = COPTS,
   visibility = ["//visibility:public"],
 )
 
+alias(
+  name = "tint_build_msl_writer",
+  actual = "//src/tint:tint_build_msl_writer_true",
+)
+
diff --git a/src/tint/lang/msl/writer/raise/BUILD.cfg b/src/tint/lang/msl/writer/raise/BUILD.cfg
new file mode 100644
index 0000000..70e4a45
--- /dev/null
+++ b/src/tint/lang/msl/writer/raise/BUILD.cfg
@@ -0,0 +1,4 @@
+{
+    "condition": "tint_build_msl_writer"
+}
+
diff --git a/src/tint/lang/msl/writer/raise/BUILD.cmake b/src/tint/lang/msl/writer/raise/BUILD.cmake
index cb64e93..0e41a3c 100644
--- a/src/tint/lang/msl/writer/raise/BUILD.cmake
+++ b/src/tint/lang/msl/writer/raise/BUILD.cmake
@@ -34,9 +34,11 @@
 #                       Do not modify this file directly
 ################################################################################
 
+if(TINT_BUILD_MSL_WRITER)
 ################################################################################
 # Target:    tint_lang_msl_writer_raise
 # Kind:      lib
+# Condition: TINT_BUILD_MSL_WRITER
 ################################################################################
 tint_add_target(tint_lang_msl_writer_raise lib
   lang/msl/writer/raise/raise.cc
@@ -44,14 +46,26 @@
 )
 
 tint_target_add_dependencies(tint_lang_msl_writer_raise lib
+  tint_api_common
+  tint_api_options
+  tint_lang_core_ir_transform
   tint_utils_containers
   tint_utils_diagnostic
   tint_utils_ice
   tint_utils_macros
   tint_utils_math
   tint_utils_memory
+  tint_utils_reflection
   tint_utils_result
   tint_utils_rtti
   tint_utils_text
   tint_utils_traits
 )
+
+if(TINT_BUILD_MSL_WRITER)
+  tint_target_add_dependencies(tint_lang_msl_writer_raise lib
+    tint_lang_msl_writer_common
+  )
+endif(TINT_BUILD_MSL_WRITER)
+
+endif(TINT_BUILD_MSL_WRITER)
\ No newline at end of file
diff --git a/src/tint/lang/msl/writer/raise/BUILD.gn b/src/tint/lang/msl/writer/raise/BUILD.gn
index bd20a51..74cc477 100644
--- a/src/tint/lang/msl/writer/raise/BUILD.gn
+++ b/src/tint/lang/msl/writer/raise/BUILD.gn
@@ -37,22 +37,31 @@
 import("../../../../../../scripts/tint_overrides_with_defaults.gni")
 
 import("${tint_src_dir}/tint.gni")
+if (tint_build_msl_writer) {
+  libtint_source_set("raise") {
+    sources = [
+      "raise.cc",
+      "raise.h",
+    ]
+    deps = [
+      "${tint_src_dir}/api/common",
+      "${tint_src_dir}/api/options",
+      "${tint_src_dir}/lang/core/ir/transform",
+      "${tint_src_dir}/utils/containers",
+      "${tint_src_dir}/utils/diagnostic",
+      "${tint_src_dir}/utils/ice",
+      "${tint_src_dir}/utils/macros",
+      "${tint_src_dir}/utils/math",
+      "${tint_src_dir}/utils/memory",
+      "${tint_src_dir}/utils/reflection",
+      "${tint_src_dir}/utils/result",
+      "${tint_src_dir}/utils/rtti",
+      "${tint_src_dir}/utils/text",
+      "${tint_src_dir}/utils/traits",
+    ]
 
-libtint_source_set("raise") {
-  sources = [
-    "raise.cc",
-    "raise.h",
-  ]
-  deps = [
-    "${tint_src_dir}/utils/containers",
-    "${tint_src_dir}/utils/diagnostic",
-    "${tint_src_dir}/utils/ice",
-    "${tint_src_dir}/utils/macros",
-    "${tint_src_dir}/utils/math",
-    "${tint_src_dir}/utils/memory",
-    "${tint_src_dir}/utils/result",
-    "${tint_src_dir}/utils/rtti",
-    "${tint_src_dir}/utils/text",
-    "${tint_src_dir}/utils/traits",
-  ]
+    if (tint_build_msl_writer) {
+      deps += [ "${tint_src_dir}/lang/msl/writer/common" ]
+    }
+  }
 }
diff --git a/src/tint/lang/msl/writer/raise/raise.cc b/src/tint/lang/msl/writer/raise/raise.cc
index 6a7cd81..2f817a6 100644
--- a/src/tint/lang/msl/writer/raise/raise.cc
+++ b/src/tint/lang/msl/writer/raise/raise.cc
@@ -29,18 +29,80 @@
 
 #include <utility>
 
-namespace tint::msl::raise {
+#include "src/tint/lang/core/ir/transform/binary_polyfill.h"
+#include "src/tint/lang/core/ir/transform/binding_remapper.h"
+#include "src/tint/lang/core/ir/transform/builtin_polyfill.h"
+#include "src/tint/lang/core/ir/transform/conversion_polyfill.h"
+#include "src/tint/lang/core/ir/transform/demote_to_helper.h"
+#include "src/tint/lang/core/ir/transform/multiplanar_external_texture.h"
+#include "src/tint/lang/core/ir/transform/preserve_padding.h"
+#include "src/tint/lang/core/ir/transform/robustness.h"
+#include "src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h"
+#include "src/tint/lang/core/ir/transform/zero_init_workgroup_memory.h"
+#include "src/tint/lang/msl/writer/common/option_helpers.h"
 
-Result<SuccessType> Raise(core::ir::Module&) {
-    // #define RUN_TRANSFORM(name)
-    //     do {
-    //         auto result = core::ir::transform::name(module);
-    //         if (!result) {
-    //             return result;
-    //         }
-    //     } while (false)
+namespace tint::msl::writer::raise {
+
+Result<SuccessType> Raise(core::ir::Module& module, const Options& options) {
+#define RUN_TRANSFORM(name, ...)         \
+    do {                                 \
+        auto result = name(__VA_ARGS__); \
+        if (!result) {                   \
+            return result;               \
+        }                                \
+    } while (false)
+
+    ExternalTextureOptions external_texture_options{};
+    RemapperData remapper_data{};
+    PopulateRemapperAndMultiplanarOptions(options, remapper_data, external_texture_options);
+    RUN_TRANSFORM(core::ir::transform::BindingRemapper, module, remapper_data);
+
+    {
+        core::ir::transform::BinaryPolyfillConfig binary_polyfills{};
+        binary_polyfills.int_div_mod = true;
+        binary_polyfills.bitshift_modulo = true;  // crbug.com/tint/1543
+        RUN_TRANSFORM(core::ir::transform::BinaryPolyfill, module, binary_polyfills);
+    }
+
+    {
+        core::ir::transform::BuiltinPolyfillConfig core_polyfills{};
+        core_polyfills.clamp_int = true;
+        core_polyfills.extract_bits = core::ir::transform::BuiltinPolyfillLevel::kClampOrRangeCheck;
+        core_polyfills.first_leading_bit = true;
+        core_polyfills.first_trailing_bit = true;
+        core_polyfills.insert_bits = core::ir::transform::BuiltinPolyfillLevel::kClampOrRangeCheck;
+        core_polyfills.texture_sample_base_clamp_to_edge_2d_f32 = true;
+        RUN_TRANSFORM(core::ir::transform::BuiltinPolyfill, module, core_polyfills);
+    }
+    // polyfills.sign_int = true;
+
+    {
+        core::ir::transform::ConversionPolyfillConfig conversion_polyfills;
+        conversion_polyfills.ftoi = true;
+        RUN_TRANSFORM(core::ir::transform::ConversionPolyfill, module, conversion_polyfills);
+    }
+
+    if (!options.disable_robustness) {
+        core::ir::transform::RobustnessConfig config{};
+        RUN_TRANSFORM(core::ir::transform::Robustness, module, config);
+    }
+
+    RUN_TRANSFORM(core::ir::transform::MultiplanarExternalTexture, module,
+                  external_texture_options);
+
+    if (!options.disable_workgroup_init) {
+        RUN_TRANSFORM(core::ir::transform::ZeroInitWorkgroupMemory, module);
+    }
+
+    // PreservePadding must come before DirectVariableAccess.
+    RUN_TRANSFORM(core::ir::transform::PreservePadding, module);
+
+    RUN_TRANSFORM(core::ir::transform::VectorizeScalarMatrixConstructors, module);
+
+    // DemoteToHelper must come before any transform that introduces non-core instructions.
+    RUN_TRANSFORM(core::ir::transform::DemoteToHelper, module);
 
     return Success;
 }
 
-}  // namespace tint::msl::raise
+}  // namespace tint::msl::writer::raise
diff --git a/src/tint/lang/msl/writer/raise/raise.h b/src/tint/lang/msl/writer/raise/raise.h
index 979d713..256925d 100644
--- a/src/tint/lang/msl/writer/raise/raise.h
+++ b/src/tint/lang/msl/writer/raise/raise.h
@@ -30,6 +30,7 @@
 
 #include <string>
 
+#include "src/tint/lang/msl/writer/common/options.h"
 #include "src/tint/utils/diagnostic/diagnostic.h"
 #include "src/tint/utils/result/result.h"
 
@@ -38,13 +39,14 @@
 class Module;
 }  // namespace tint::core::ir
 
-namespace tint::msl::raise {
+namespace tint::msl::writer::raise {
 
 /// Raise a core IR module to the MSL dialect of the IR.
-/// @param mod the core IR module to raise to MSL dialect
+/// @param module the core IR module to raise to MSL dialect
+/// @param options the printer options
 /// @returns success or failure
-Result<SuccessType> Raise(core::ir::Module& mod);
+Result<SuccessType> Raise(core::ir::Module& module, const Options& options);
 
-}  // namespace tint::msl::raise
+}  // namespace tint::msl::writer::raise
 
 #endif  // SRC_TINT_LANG_MSL_WRITER_RAISE_RAISE_H_
diff --git a/src/tint/lang/msl/writer/writer.cc b/src/tint/lang/msl/writer/writer.cc
index 54bf13b..bc1a5e0 100644
--- a/src/tint/lang/msl/writer/writer.cc
+++ b/src/tint/lang/msl/writer/writer.cc
@@ -53,7 +53,7 @@
     Output output;
 
     // Raise from core-dialect to MSL-dialect.
-    if (auto res = raise::Raise(ir); !res) {
+    if (auto res = raise::Raise(ir, options); !res) {
         return res.Failure();
     }
 
diff --git a/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.ir.msl b/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.ir.msl
index 144b0eb..96b4b6f 100644
--- a/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.ir.msl
@@ -4,5 +4,5 @@
 kernel void f() {
   int const a = 1;
   uint const b = 2u;
-  int const r = (a << b);
+  int const r = (a << (b & 31u));
 }
diff --git a/test/tint/expressions/binary/left-shift/scalar-scalar/u32.wgsl.expected.ir.msl b/test/tint/expressions/binary/left-shift/scalar-scalar/u32.wgsl.expected.ir.msl
index 0e51a63..ce78acb 100644
--- a/test/tint/expressions/binary/left-shift/scalar-scalar/u32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/binary/left-shift/scalar-scalar/u32.wgsl.expected.ir.msl
@@ -4,5 +4,5 @@
 kernel void f() {
   uint const a = 1u;
   uint const b = 2u;
-  uint const r = (a << b);
+  uint const r = (a << (b & 31u));
 }
diff --git a/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.ir.msl b/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.ir.msl
index 73b1379..d9345f3 100644
--- a/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.ir.msl
@@ -4,5 +4,5 @@
 kernel void f() {
   int3 const a = int3(1, 2, 3);
   uint3 const b = uint3(4u, 5u, 6u);
-  int3 const r = (a << b);
+  int3 const r = (a << (b & uint3(31u)));
 }
diff --git a/test/tint/expressions/binary/left-shift/vector-vector/u32.wgsl.expected.ir.msl b/test/tint/expressions/binary/left-shift/vector-vector/u32.wgsl.expected.ir.msl
index 5cd797a..6ebad69 100644
--- a/test/tint/expressions/binary/left-shift/vector-vector/u32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/binary/left-shift/vector-vector/u32.wgsl.expected.ir.msl
@@ -4,5 +4,5 @@
 kernel void f() {
   uint3 const a = uint3(1u, 2u, 3u);
   uint3 const b = uint3(4u, 5u, 6u);
-  uint3 const r = (a << b);
+  uint3 const r = (a << (b & uint3(31u)));
 }
diff --git a/test/tint/expressions/binary/right-shift/scalar-scalar/i32.wgsl.expected.ir.msl b/test/tint/expressions/binary/right-shift/scalar-scalar/i32.wgsl.expected.ir.msl
index e7b1f46..b5af548 100644
--- a/test/tint/expressions/binary/right-shift/scalar-scalar/i32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/binary/right-shift/scalar-scalar/i32.wgsl.expected.ir.msl
@@ -4,5 +4,5 @@
 kernel void f() {
   int const a = 1;
   uint const b = 2u;
-  int const r = (a >> b);
+  int const r = (a >> (b & 31u));
 }
diff --git a/test/tint/expressions/binary/right-shift/scalar-scalar/u32.wgsl.expected.ir.msl b/test/tint/expressions/binary/right-shift/scalar-scalar/u32.wgsl.expected.ir.msl
index 27bdf8a..accf6ef 100644
--- a/test/tint/expressions/binary/right-shift/scalar-scalar/u32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/binary/right-shift/scalar-scalar/u32.wgsl.expected.ir.msl
@@ -4,5 +4,5 @@
 kernel void f() {
   uint const a = 1u;
   uint const b = 2u;
-  uint const r = (a >> b);
+  uint const r = (a >> (b & 31u));
 }
diff --git a/test/tint/expressions/binary/right-shift/vector-vector/i32.wgsl.expected.ir.msl b/test/tint/expressions/binary/right-shift/vector-vector/i32.wgsl.expected.ir.msl
index 7e1de7a..0b04d2f 100644
--- a/test/tint/expressions/binary/right-shift/vector-vector/i32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/binary/right-shift/vector-vector/i32.wgsl.expected.ir.msl
@@ -4,5 +4,5 @@
 kernel void f() {
   int3 const a = int3(1, 2, 3);
   uint3 const b = uint3(4u, 5u, 6u);
-  int3 const r = (a >> b);
+  int3 const r = (a >> (b & uint3(31u)));
 }
diff --git a/test/tint/expressions/binary/right-shift/vector-vector/u32.wgsl.expected.ir.msl b/test/tint/expressions/binary/right-shift/vector-vector/u32.wgsl.expected.ir.msl
index fa984d3..19c6d13 100644
--- a/test/tint/expressions/binary/right-shift/vector-vector/u32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/binary/right-shift/vector-vector/u32.wgsl.expected.ir.msl
@@ -4,5 +4,5 @@
 kernel void f() {
   uint3 const a = uint3(1u, 2u, 3u);
   uint3 const b = uint3(4u, 5u, 6u);
-  uint3 const r = (a >> b);
+  uint3 const r = (a >> (b & uint3(31u)));
 }