[dawn] Substitute overrides for IR fuzzer

Bug: 383725598
Change-Id: Ic674f7a606eaf91853fe99ae218447ff4f525ea0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/233534
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: Peter McNeeley <petermcneeley@google.com>
diff --git a/src/tint/cmd/fuzz/ir/BUILD.cmake b/src/tint/cmd/fuzz/ir/BUILD.cmake
index b65af42..7f7fd3f 100644
--- a/src/tint/cmd/fuzz/ir/BUILD.cmake
+++ b/src/tint/cmd/fuzz/ir/BUILD.cmake
@@ -144,6 +144,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_ir
+  tint_lang_core_ir_transform
   tint_lang_core_type
   tint_lang_wgsl
   tint_lang_wgsl_ast
diff --git a/src/tint/cmd/fuzz/ir/BUILD.gn b/src/tint/cmd/fuzz/ir/BUILD.gn
index d146d64..be9ecdc 100644
--- a/src/tint/cmd/fuzz/ir/BUILD.gn
+++ b/src/tint/cmd/fuzz/ir/BUILD.gn
@@ -51,6 +51,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/ir",
+    "${tint_src_dir}/lang/core/ir/transform",
     "${tint_src_dir}/lang/core/type",
     "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
diff --git a/src/tint/cmd/fuzz/ir/as/BUILD.bazel b/src/tint/cmd/fuzz/ir/as/BUILD.bazel
index 83c5aee..f102150 100644
--- a/src/tint/cmd/fuzz/ir/as/BUILD.bazel
+++ b/src/tint/cmd/fuzz/ir/as/BUILD.bazel
@@ -48,6 +48,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/ir",
+    "//src/tint/lang/core/ir/transform",
     "//src/tint/lang/core/type",
     "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
diff --git a/src/tint/cmd/fuzz/ir/as/BUILD.cmake b/src/tint/cmd/fuzz/ir/as/BUILD.cmake
index 6acedeb..be465fcff 100644
--- a/src/tint/cmd/fuzz/ir/as/BUILD.cmake
+++ b/src/tint/cmd/fuzz/ir/as/BUILD.cmake
@@ -51,6 +51,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_ir
+  tint_lang_core_ir_transform
   tint_lang_core_type
   tint_lang_wgsl
   tint_lang_wgsl_ast
diff --git a/src/tint/cmd/fuzz/ir/as/BUILD.gn b/src/tint/cmd/fuzz/ir/as/BUILD.gn
index 8307c40..0c269f2 100644
--- a/src/tint/cmd/fuzz/ir/as/BUILD.gn
+++ b/src/tint/cmd/fuzz/ir/as/BUILD.gn
@@ -50,6 +50,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/ir",
+      "${tint_src_dir}/lang/core/ir/transform",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
diff --git a/src/tint/cmd/fuzz/ir/as/main.cc b/src/tint/cmd/fuzz/ir/as/main.cc
index 82dec89..b03c51f 100644
--- a/src/tint/cmd/fuzz/ir/as/main.cc
+++ b/src/tint/cmd/fuzz/ir/as/main.cc
@@ -177,17 +177,18 @@
         return tint::Failure{"Unsupported enable used in shader"};
     }
 
-    auto transformed = tint::wgsl::ApplySubstituteOverrides(program);
-    auto& src = transformed ? transformed.value() : program;
-    if (!src.IsValid()) {
-        return tint::Failure{src.Diagnostics().Str()};
-    }
+    auto cfg = tint::wgsl::SubstituteOverridesConfig(program);
 
     auto ir = tint::wgsl::reader::ProgramToLoweredIR(src);
     if (ir != tint::Success) {
         return ir.Failure();
     }
 
+    auto substituteOverridesResult = tint::core::ir::transform::SubstituteOverrides(ir.Get(), cfg);
+    if (substituteOverridesResult != Success) {
+        return substituteOverridesResult.Failure();
+    }
+
     if (auto val = tint::core::ir::Validate(ir.Get()); val != tint::Success) {
         return val.Failure();
     }
diff --git a/src/tint/cmd/fuzz/ir/fuzz.cc b/src/tint/cmd/fuzz/ir/fuzz.cc
index 1703665..f3343cd 100644
--- a/src/tint/cmd/fuzz/ir/fuzz.cc
+++ b/src/tint/cmd/fuzz/ir/fuzz.cc
@@ -39,6 +39,7 @@
 
 #if TINT_BUILD_WGSL_READER
 #include "src/tint/cmd/fuzz/wgsl/fuzz.h"
+#include "src/tint/lang/core/ir/transform/substitute_overrides.h"
 #include "src/tint/lang/core/ir/validator.h"
 #include "src/tint/lang/wgsl/ast/module.h"
 #include "src/tint/lang/wgsl/helpers/apply_substitute_overrides.h"
@@ -74,15 +75,19 @@
             if (program.AST().Enables().Any(tint::wgsl::reader::IsUnsupportedByIR)) {
                 return;
             }
-            auto transformed = tint::wgsl::ApplySubstituteOverrides(program);
-            auto& src = transformed ? transformed.value() : program;
-            if (!src.IsValid()) {
-                return;
-            }
-            auto ir = tint::wgsl::reader::ProgramToLoweredIR(src);
+            auto cfg = tint::wgsl::SubstituteOverridesConfig(program);
+
+            auto ir = tint::wgsl::reader::ProgramToLoweredIR(program);
             if (ir != Success) {
                 return;
             }
+
+            auto substituteOverridesResult =
+                tint::core::ir::transform::SubstituteOverrides(ir.Get(), cfg);
+            if (substituteOverridesResult != Success) {
+                return;
+            }
+
             if (auto val = core::ir::Validate(ir.Get()); val != Success) {
                 TINT_ICE() << val.Failure();
             }
diff --git a/src/tint/lang/wgsl/helpers/BUILD.bazel b/src/tint/lang/wgsl/helpers/BUILD.bazel
index 90df8d0..844f2f5 100644
--- a/src/tint/lang/wgsl/helpers/BUILD.bazel
+++ b/src/tint/lang/wgsl/helpers/BUILD.bazel
@@ -52,10 +52,11 @@
     "//src/tint/api/common",
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
+    "//src/tint/lang/core/ir",
+    "//src/tint/lang/core/ir/transform",
     "//src/tint/lang/core/type",
     "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
-    "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/features",
     "//src/tint/lang/wgsl/inspector",
     "//src/tint/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/helpers/BUILD.cmake b/src/tint/lang/wgsl/helpers/BUILD.cmake
index 414d646..0e91fce 100644
--- a/src/tint/lang/wgsl/helpers/BUILD.cmake
+++ b/src/tint/lang/wgsl/helpers/BUILD.cmake
@@ -51,10 +51,11 @@
   tint_api_common
   tint_lang_core
   tint_lang_core_constant
+  tint_lang_core_ir
+  tint_lang_core_ir_transform
   tint_lang_core_type
   tint_lang_wgsl
   tint_lang_wgsl_ast
-  tint_lang_wgsl_ast_transform
   tint_lang_wgsl_features
   tint_lang_wgsl_inspector
   tint_lang_wgsl_program
diff --git a/src/tint/lang/wgsl/helpers/BUILD.gn b/src/tint/lang/wgsl/helpers/BUILD.gn
index f69ca43..2c2e4c0 100644
--- a/src/tint/lang/wgsl/helpers/BUILD.gn
+++ b/src/tint/lang/wgsl/helpers/BUILD.gn
@@ -57,10 +57,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/ir/transform",
     "${tint_src_dir}/lang/core/type",
     "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
-    "${tint_src_dir}/lang/wgsl/ast/transform",
     "${tint_src_dir}/lang/wgsl/features",
     "${tint_src_dir}/lang/wgsl/inspector",
     "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/helpers/apply_substitute_overrides.cc b/src/tint/lang/wgsl/helpers/apply_substitute_overrides.cc
index 18f32ab..eee817d 100644
--- a/src/tint/lang/wgsl/helpers/apply_substitute_overrides.cc
+++ b/src/tint/lang/wgsl/helpers/apply_substitute_overrides.cc
@@ -30,15 +30,15 @@
 #include <memory>
 #include <utility>
 
-#include "src/tint/lang/wgsl/ast/transform/manager.h"
-#include "src/tint/lang/wgsl/ast/transform/substitute_override.h"
+#include "src/tint/lang/core/ir/transform/substitute_overrides.h"
 #include "src/tint/lang/wgsl/inspector/inspector.h"
 #include "src/tint/lang/wgsl/program/program.h"
 
 namespace tint::wgsl {
 
-std::optional<Program> ApplySubstituteOverrides(const Program& program) {
-    ast::transform::SubstituteOverride::Config cfg;
+tint::core::ir::transform::SubstituteOverridesConfig SubstituteOverridesConfig(
+    const Program& program) {
+    tint::core::ir::transform::SubstituteOverridesConfig cfg;
     inspector::Inspector inspector(program);
     auto default_values = inspector.GetOverrideDefaultValues();
     for (const auto& [override_id, scalar] : default_values) {
@@ -49,18 +49,7 @@
         }
     }
 
-    if (default_values.empty()) {
-        return std::nullopt;
-    }
-
-    ast::transform::DataMap override_data;
-    override_data.Add<ast::transform::SubstituteOverride::Config>(cfg);
-
-    ast::transform::Manager mgr;
-    mgr.append(std::make_unique<ast::transform::SubstituteOverride>());
-
-    ast::transform::DataMap outputs;
-    return mgr.Run(program, override_data, outputs);
+    return cfg;
 }
 
 }  // namespace tint::wgsl
diff --git a/src/tint/lang/wgsl/helpers/apply_substitute_overrides.h b/src/tint/lang/wgsl/helpers/apply_substitute_overrides.h
index a15afa2..20d7ae90 100644
--- a/src/tint/lang/wgsl/helpers/apply_substitute_overrides.h
+++ b/src/tint/lang/wgsl/helpers/apply_substitute_overrides.h
@@ -30,6 +30,8 @@
 
 #include <optional>
 
+#include "src/tint/lang/core/ir/transform/substitute_overrides.h"
+
 // Forward declarations
 namespace tint {
 class Program;
@@ -37,12 +39,11 @@
 
 namespace tint::wgsl {
 
-/// If needed, returns a new program with all `override` declarations substituted with `const`
-/// variables.
+/// Returns a IR substitute override config which may contain an empty map if there a no overrides
 /// @param program A valid program
-/// @return A new program with `override`s substituted, or std::nullopt if the program has no
-/// `override`s.
-std::optional<Program> ApplySubstituteOverrides(const Program& program);
+/// @return An IR substitute override config
+tint::core::ir::transform::SubstituteOverridesConfig SubstituteOverridesConfig(
+    const Program& program);
 
 }  // namespace tint::wgsl