[msl] Add benchmark for IR backend

Bug: 42251016
Change-Id: Ib9499bc176e11461aff219277b883e632abfa8a8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/204536
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/lang/msl/writer/BUILD.bazel b/src/tint/lang/msl/writer/BUILD.bazel
index adf42fa..a4c0c47 100644
--- a/src/tint/lang/msl/writer/BUILD.bazel
+++ b/src/tint/lang/msl/writer/BUILD.bazel
@@ -144,9 +144,11 @@
     "//src/tint/api/common",
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
+    "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
     "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
+    "//src/tint/lang/wgsl/common",
     "//src/tint/lang/wgsl/features",
     "//src/tint/lang/wgsl/helpers",
     "//src/tint/lang/wgsl/program",
@@ -176,6 +178,7 @@
   }) + select({
     ":tint_build_wgsl_reader": [
       "//src/tint/cmd/bench:bench",
+      "//src/tint/lang/wgsl/reader",
     ],
     "//conditions:default": [],
   }),
diff --git a/src/tint/lang/msl/writer/BUILD.cmake b/src/tint/lang/msl/writer/BUILD.cmake
index 40cde20..093da65 100644
--- a/src/tint/lang/msl/writer/BUILD.cmake
+++ b/src/tint/lang/msl/writer/BUILD.cmake
@@ -166,9 +166,11 @@
   tint_api_common
   tint_lang_core
   tint_lang_core_constant
+  tint_lang_core_ir
   tint_lang_core_type
   tint_lang_wgsl
   tint_lang_wgsl_ast
+  tint_lang_wgsl_common
   tint_lang_wgsl_features
   tint_lang_wgsl_helpers
   tint_lang_wgsl_program
@@ -204,6 +206,7 @@
 if(TINT_BUILD_WGSL_READER)
   tint_target_add_dependencies(tint_lang_msl_writer_bench bench
     tint_cmd_bench_bench
+    tint_lang_wgsl_reader
   )
 endif(TINT_BUILD_WGSL_READER)
 
diff --git a/src/tint/lang/msl/writer/BUILD.gn b/src/tint/lang/msl/writer/BUILD.gn
index d5b2bfa..c051e96 100644
--- a/src/tint/lang/msl/writer/BUILD.gn
+++ b/src/tint/lang/msl/writer/BUILD.gn
@@ -149,9 +149,11 @@
         "${tint_src_dir}/api/common",
         "${tint_src_dir}/lang/core",
         "${tint_src_dir}/lang/core/constant",
+        "${tint_src_dir}/lang/core/ir",
         "${tint_src_dir}/lang/core/type",
         "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
+        "${tint_src_dir}/lang/wgsl/common",
         "${tint_src_dir}/lang/wgsl/features",
         "${tint_src_dir}/lang/wgsl/helpers",
         "${tint_src_dir}/lang/wgsl/program",
@@ -180,7 +182,10 @@
       }
 
       if (tint_build_wgsl_reader) {
-        deps += [ "${tint_src_dir}/cmd/bench:bench" ]
+        deps += [
+          "${tint_src_dir}/cmd/bench:bench",
+          "${tint_src_dir}/lang/wgsl/reader",
+        ]
       }
     }
   }
diff --git a/src/tint/lang/msl/writer/writer_bench.cc b/src/tint/lang/msl/writer/writer_bench.cc
index 000f26e..a48524f 100644
--- a/src/tint/lang/msl/writer/writer_bench.cc
+++ b/src/tint/lang/msl/writer/writer_bench.cc
@@ -32,11 +32,61 @@
 #include "src/tint/lang/msl/writer/writer.h"
 #include "src/tint/lang/wgsl/ast/module.h"
 #include "src/tint/lang/wgsl/helpers/flatten_bindings.h"
+#include "src/tint/lang/wgsl/reader/reader.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
 
 namespace tint::msl::writer {
 namespace {
 
+void GenerateMSL(benchmark::State& state, std::string input_name) {
+    auto res = bench::GetWgslProgram(input_name);
+    if (res != Success) {
+        state.SkipWithError(res.Failure().reason.Str());
+        return;
+    }
+
+    // Remap resource numbers to a flat namespace.
+    const tint::Program* program = &res->program;
+    auto flattened = tint::wgsl::FlattenBindings(res->program);
+    if (flattened) {
+        program = &*flattened;
+    }
+
+    tint::msl::writer::Options gen_options = {};
+    gen_options.array_length_from_uniform.ubo_binding = 30;
+    gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 0},
+                                                                          0);
+    gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 1},
+                                                                          1);
+    gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 2},
+                                                                          2);
+    gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 3},
+                                                                          3);
+    gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 4},
+                                                                          4);
+    gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 5},
+                                                                          5);
+    gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 6},
+                                                                          6);
+    gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 7},
+                                                                          7);
+    gen_options.bindings = tint::msl::writer::GenerateBindings(*program);
+
+    for (auto _ : state) {
+        // Convert the AST program to an IR module.
+        auto ir = tint::wgsl::reader::ProgramToLoweredIR(*program);
+        if (ir != Success) {
+            state.SkipWithError(ir.Failure().reason.Str());
+            return;
+        }
+
+        auto gen_res = Generate(ir.Get(), gen_options);
+        if (gen_res != Success) {
+            state.SkipWithError(gen_res.Failure().reason.Str());
+        }
+    }
+}
+
 void GenerateMSL_AST(benchmark::State& state, std::string input_name) {
     auto res = bench::GetWgslProgram(input_name);
     if (res != Success) {
@@ -79,6 +129,7 @@
     }
 }
 
+TINT_BENCHMARK_PROGRAMS(GenerateMSL);
 TINT_BENCHMARK_PROGRAMS(GenerateMSL_AST);
 
 }  // namespace