[hlsl] Use IR by default for CLI and E2E tests.

The `hlsl-dxc-ir` and `hlsl-fxc-ir` formats are now skipped in the E2E
test runner. They will be removed when the CQ has been updated to no
longer use them.

The `hlsl-dxc` and `hlsl-fxc` expectations are currently set to the `ir`
outputs until the expectations are moved around.

Bug: 421916945
Change-Id: I1773b888b16abefe2505139676866d22cea08470
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/248314
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/include/tint/tint.h b/include/tint/tint.h
index be2bb51..7ea2f98 100644
--- a/include/tint/tint.h
+++ b/include/tint/tint.h
@@ -40,11 +40,6 @@
 #include "src/tint/lang/core/ir/transform/single_entry_point.h"
 #include "src/tint/lang/core/ir/transform/substitute_overrides.h"
 #include "src/tint/lang/core/type/manager.h"
-#include "src/tint/lang/wgsl/ast/transform/first_index_offset.h"
-#include "src/tint/lang/wgsl/ast/transform/manager.h"
-#include "src/tint/lang/wgsl/ast/transform/renamer.h"
-#include "src/tint/lang/wgsl/ast/transform/single_entry_point.h"
-#include "src/tint/lang/wgsl/ast/transform/substitute_override.h"
 #include "src/tint/lang/wgsl/inspector/inspector.h"
 #include "src/tint/utils/diagnostic/formatter.h"
 #include "src/tint/utils/text/styled_text.h"
diff --git a/src/dawn/native/Toggles.h b/src/dawn/native/Toggles.h
index 6e8707f..b283682 100644
--- a/src/dawn/native/Toggles.h
+++ b/src/dawn/native/Toggles.h
@@ -131,6 +131,7 @@
     ResolveMultipleAttachmentInSeparatePasses,
     D3D12CreateNotZeroedHeap,
     D3D12DontUseNotZeroedHeapFlagOnTexturesAsCommitedResources,
+    // TODO(421916945): Remove when CQ no longer uses this flag.
     UseTintIR,
     D3DDisableIEEEStrictness,
     PolyFillPacked4x8DotProduct,
diff --git a/src/tint/cmd/bench/hlsl/writer_bench.cc b/src/tint/cmd/bench/hlsl/writer_bench.cc
index ceaab2c..2a55e6b 100644
--- a/src/tint/cmd/bench/hlsl/writer_bench.cc
+++ b/src/tint/cmd/bench/hlsl/writer_bench.cc
@@ -50,7 +50,7 @@
         }
 
         Options gen_options;
-        gen_options.bindings = GenerateBindings(res->program);
+        gen_options.bindings = GenerateBindings(ir.Get());
         auto gen_res = Generate(ir.Get(), gen_options);
         if (gen_res != Success) {
             state.SkipWithError(gen_res.Failure().reason);
@@ -58,24 +58,7 @@
     }
 }
 
-void GenerateHLSL_AST(benchmark::State& state, std::string input_name) {
-    auto res = bench::GetWgslProgram(input_name);
-    if (res != Success) {
-        state.SkipWithError(res.Failure().reason);
-        return;
-    }
-    for (auto _ : state) {
-        Options gen_options;
-        gen_options.bindings = GenerateBindings(res->program);
-        auto gen_res = Generate(res->program, gen_options);
-        if (gen_res != Success) {
-            state.SkipWithError(gen_res.Failure().reason);
-        }
-    }
-}
-
 TINT_BENCHMARK_PROGRAMS(GenerateHLSL);
-TINT_BENCHMARK_PROGRAMS(GenerateHLSL_AST);
 
 }  // namespace
 }  // namespace tint::hlsl::writer
diff --git a/src/tint/cmd/common/helper.cc b/src/tint/cmd/common/helper.cc
index c8e8bc8..d2a97ae 100644
--- a/src/tint/cmd/common/helper.cc
+++ b/src/tint/cmd/common/helper.cc
@@ -111,7 +111,7 @@
 
 #if TINT_BUILD_SPV_READER
 tint::Program ReadSpirv(const std::vector<uint32_t>& data, const LoadProgramOptions& opts) {
-    if (opts.use_ir) {
+    if (opts.use_ir_reader) {
 #if TINT_BUILD_WGSL_WRITER
         // Parse the SPIR-V binary to a core Tint IR module.
         auto result = tint::spirv::reader::ReadIR(data, opts.spirv_reader_options);
diff --git a/src/tint/cmd/common/helper.h b/src/tint/cmd/common/helper.h
index 3e4fb24..0e52af1 100644
--- a/src/tint/cmd/common/helper.h
+++ b/src/tint/cmd/common/helper.h
@@ -76,7 +76,7 @@
     std::string filename;
 #if TINT_BUILD_SPV_READER
     /// Spirv-reader options
-    bool use_ir = false;
+    bool use_ir_reader = false;
     tint::spirv::reader::Options spirv_reader_options;
 #endif
     /// The text printer to use for output
diff --git a/src/tint/cmd/tint/BUILD.bazel b/src/tint/cmd/tint/BUILD.bazel
index 4fca497..4c940ac 100644
--- a/src/tint/cmd/tint/BUILD.bazel
+++ b/src/tint/cmd/tint/BUILD.bazel
@@ -55,7 +55,6 @@
     "//src/tint/lang/msl/ir/transform",
     "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
-    "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/inspector",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/cmd/tint/BUILD.cmake b/src/tint/cmd/tint/BUILD.cmake
index 5a035d9..dd244dd 100644
--- a/src/tint/cmd/tint/BUILD.cmake
+++ b/src/tint/cmd/tint/BUILD.cmake
@@ -56,7 +56,6 @@
   tint_lang_msl_ir_transform
   tint_lang_wgsl
   tint_lang_wgsl_ast
-  tint_lang_wgsl_ast_transform
   tint_lang_wgsl_inspector
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/cmd/tint/BUILD.gn b/src/tint/cmd/tint/BUILD.gn
index 695ea50..e12c881 100644
--- a/src/tint/cmd/tint/BUILD.gn
+++ b/src/tint/cmd/tint/BUILD.gn
@@ -57,7 +57,6 @@
     "${tint_src_dir}/lang/msl/ir/transform",
     "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
-    "${tint_src_dir}/lang/wgsl/ast/transform",
     "${tint_src_dir}/lang/wgsl/inspector",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/cmd/tint/main.cc b/src/tint/cmd/tint/main.cc
index 8778487..f068b76 100644
--- a/src/tint/cmd/tint/main.cc
+++ b/src/tint/cmd/tint/main.cc
@@ -48,10 +48,6 @@
 #include "src/tint/lang/core/ir/var.h"
 #include "src/tint/lang/msl/ir/transform/flatten_bindings.h"
 #include "src/tint/lang/wgsl/ast/module.h"
-#include "src/tint/lang/wgsl/ast/transform/manager.h"
-#include "src/tint/lang/wgsl/ast/transform/renamer.h"
-#include "src/tint/lang/wgsl/ast/transform/single_entry_point.h"
-#include "src/tint/lang/wgsl/ast/transform/substitute_override.h"
 #include "src/tint/utils/command/cli.h"
 #include "src/tint/utils/command/command.h"
 #include "src/tint/utils/containers/transform.h"
@@ -155,7 +151,6 @@
     bool enable_robustness = true;
 
     bool dump_ir = false;
-    bool use_ir = false;
     bool use_ir_reader = false;
 
 #if TINT_BUILD_SYNTAX_TREE_WRITER
@@ -298,9 +293,9 @@
                                              Parameter{"name"});
     TINT_DEFER(opts->output_file = output.value.value_or(""));
 
-    auto& use_ir = options.Add<BoolOption>(
+    // TODO(421916945): Remove when CQ no longer uses this flag
+    [[maybe_unused]] auto& use_ir = options.Add<BoolOption>(
         "use-ir", "Use the IR for writers and transforms when possible", Default{false});
-    TINT_DEFER(opts->use_ir = *use_ir.value);
 
     auto& use_ir_reader = options.Add<BoolOption>(
         "use-ir-reader", "Use the IR for the SPIR-V reader", Default{false});
@@ -684,55 +679,12 @@
 }
 TINT_END_DISABLE_WARNING(UNSAFE_BUFFER_USAGE);
 
-[[maybe_unused]] void AddRenamer(Options& options,
-                                 tint::ast::transform::Manager& transform_manager,
-                                 tint::ast::transform::DataMap& transform_inputs) {
-    switch (options.format) {
-        case Format::kMsl: {
-            // Renaming is handled in the backend.
-            break;
-        }
-        case Format::kGlsl: {
-            // Renaming is handled in the backend.
-            break;
-        }
-        case Format::kHlsl:
-        case Format::kHlslFxc: {
-            if (options.use_ir) {
-                // Renaming is handled in the backend.
-                break;
-            }
-            if (!options.rename_all) {
-                transform_inputs.Add<tint::ast::transform::Renamer::Config>(
-                    tint::ast::transform::Renamer::Target::kHlslKeywords);
-            }
-            transform_manager.Add<tint::ast::transform::Renamer>();
-            break;
-        }
-        case Format::kSpirv:
-        case Format::kSpvAsm:
-            // Renaming is handled in the backend.
-            break;
-        case Format::kWgsl:
-        case Format::kIr: {
-            if (options.rename_all) {
-                transform_manager.Add<tint::ast::transform::Renamer>();
-            }
-            break;
-        }
-        case Format::kNone:
-        case Format::kUnknown:
-            break;
-    }
-}
-
-tint::diag::Result<std::unordered_map<tint::OverrideId, double>> CreateOverrideMap(
-    Options& options,
-    tint::inspector::Inspector& inspector) {
+[[maybe_unused]] tint::diag::Result<tint::core::ir::transform::SubstituteOverridesConfig>
+CreateOverrideMap(Options& options, tint::inspector::Inspector& inspector) {
     auto override_names = inspector.GetNamedOverrideIds();
 
-    std::unordered_map<tint::OverrideId, double> values;
-    values.reserve(options.overrides.Count());
+    tint::core::ir::transform::SubstituteOverridesConfig cfg;
+    cfg.map.reserve(options.overrides.Count());
     for (auto& override : options.overrides) {
         const auto& override_name = override.key.Value();
         const auto& override_value = override.value;
@@ -743,7 +695,7 @@
         auto num = tint::strconv::ParseNumber<decltype(tint::OverrideId::value)>(override_name);
         if (num == tint::Success) {
             tint::OverrideId id{num.Get()};
-            values.emplace(id, override_value);
+            cfg.map.emplace(id, override_value);
             continue;
         }
 
@@ -751,59 +703,9 @@
         if (it == override_names.end()) {
             return tint::diag::Failure("unknown override '" + override_name + "'");
         }
-        values.emplace(it->second, override_value);
+        cfg.map.emplace(it->second, override_value);
     }
-    return values;
-}
-
-void AddSubstituteOverrides(std::unordered_map<tint::OverrideId, double> values,
-                            tint::ast::transform::Manager& transform_manager,
-                            tint::ast::transform::DataMap& transform_inputs) {
-    tint::ast::transform::SubstituteOverride::Config cfg;
-    cfg.map = std::move(values);
-
-    transform_inputs.Add<tint::ast::transform::SubstituteOverride::Config>(cfg);
-    transform_manager.Add<tint::ast::transform::SubstituteOverride>();
-}
-
-[[maybe_unused]] tint::diag::Result<tint::Program> ProcessASTTransforms(
-    Options& options,
-    tint::inspector::Inspector& inspector,
-    tint::Program& program,
-    std::optional<tint::ast::transform::SubstituteOverride::Config>& cfg) {
-    tint::ast::transform::Manager transform_manager;
-    tint::ast::transform::DataMap transform_inputs;
-
-    // In the case where there are no entry points, the ep_name is blank and we need to skip single
-    // entry point.
-    if (!options.use_ir && options.ep_name != "") {
-        transform_manager.append(std::make_unique<tint::ast::transform::SingleEntryPoint>());
-        transform_inputs.Add<tint::ast::transform::SingleEntryPoint::Config>(options.ep_name);
-    }
-
-    AddRenamer(options, transform_manager, transform_inputs);
-
-    auto res = CreateOverrideMap(options, inspector);
-    if (res != tint::Success) {
-        return res.Failure();
-    }
-    if (options.use_ir) {
-        tint::ast::transform::SubstituteOverride::Config cfg_temp;
-        cfg_temp.map = std::move(res.Get());
-        cfg = cfg_temp;
-    } else {
-        AddSubstituteOverrides(res.Get(), transform_manager, transform_inputs);
-    }
-
-    tint::ast::transform::DataMap outputs;
-    auto transformed = transform_manager.Run(program, std::move(transform_inputs), outputs);
-    if (!transformed.IsValid()) {
-        std::stringstream err;
-        tint::cmd::PrintWGSL(err, transformed);
-        err << transformed.Diagnostics() << "\n";
-        return tint::diag::Failure(err.str());
-    }
-    return transformed;
+    return cfg;
 }
 
 #if TINT_BUILD_SPV_WRITER
@@ -855,16 +757,8 @@
                    [[maybe_unused]] tint::inspector::Inspector& inspector,
                    [[maybe_unused]] tint::Program& src_program) {
 #if TINT_BUILD_SPV_WRITER
-
-    std::optional<tint::ast::transform::SubstituteOverride::Config> cfg;
-    auto res = ProcessASTTransforms(options, inspector, src_program, cfg);
-    if (res != tint::Success) {
-        std::cerr << res.Failure() << "\n";
-        return true;
-    }
-
     // Convert the AST program to an IR module.
-    auto ir = tint::wgsl::reader::ProgramToLoweredIR(res.Get());
+    auto ir = tint::wgsl::reader::ProgramToLoweredIR(src_program);
     if (ir != tint::Success) {
         std::cerr << "Failed to generate IR: " << ir << "\n";
         return false;
@@ -879,18 +773,19 @@
         }
     }
 
-    if (cfg) {
-        // this needs to run after SingleEntryPoint transform which removes unused
-        // overrides for the current entry point.
-        tint::core::ir::transform::SubstituteOverridesConfig ir_cfg;
-        ir_cfg.map = cfg->map;
-        auto substituteOverridesResult =
-            tint::core::ir::transform::SubstituteOverrides(ir.Get(), ir_cfg);
-        if (substituteOverridesResult != tint::Success) {
-            std::cerr << "Pipeline override substitution (IR) failed:\n"
-                      << substituteOverridesResult.Failure() << "\n";
-            return false;
-        }
+    // this needs to run after SingleEntryPoint transform which removes unused
+    // overrides for the current entry point.
+    auto substitute_override_cfg = CreateOverrideMap(options, inspector);
+    if (substitute_override_cfg != tint::Success) {
+        std::cerr << "Failed to create override map: " << substitute_override_cfg.Failure() << "\n";
+        return false;
+    }
+    auto substituteOverridesResult =
+        tint::core::ir::transform::SubstituteOverrides(ir.Get(), substitute_override_cfg.Get());
+    if (substituteOverridesResult != tint::Success) {
+        std::cerr << "Pipeline override substitution (IR) failed:\n"
+                  << substituteOverridesResult.Failure() << "\n";
+        return false;
     }
 
     tint::spirv::writer::Options gen_options;
@@ -934,7 +829,7 @@
     // Generate SPIR-V from Tint IR.
     auto result = tint::spirv::writer::Generate(ir.Get(), gen_options);
     if (result != tint::Success) {
-        tint::cmd::PrintWGSL(std::cerr, res.Get());
+        tint::cmd::PrintWGSL(std::cerr, src_program);
         std::cerr << "Failed to generate SPIR-V: " << result.Failure() << "\n";
         return false;
     }
@@ -1031,16 +926,8 @@
                  [[maybe_unused]] tint::inspector::Inspector& inspector,
                  [[maybe_unused]] tint::Program& src_program) {
 #if TINT_BUILD_MSL_WRITER
-
-    std::optional<tint::ast::transform::SubstituteOverride::Config> cfg;
-    auto transform_res = ProcessASTTransforms(options, inspector, src_program, cfg);
-    if (transform_res != tint::Success) {
-        std::cerr << transform_res.Failure() << "\n";
-        return true;
-    }
-
     // Convert the AST program to an IR module.
-    auto ir = tint::wgsl::reader::ProgramToLoweredIR(transform_res.Get());
+    auto ir = tint::wgsl::reader::ProgramToLoweredIR(src_program);
     if (ir != tint::Success) {
         std::cerr << "Failed to generate IR: " << ir << "\n";
         return false;
@@ -1055,18 +942,19 @@
         }
     }
 
-    if (cfg) {
-        // this needs to run after SingleEntryPoint transform which removes unused
-        // overrides for the current entry point.
-        tint::core::ir::transform::SubstituteOverridesConfig ir_cfg;
-        ir_cfg.map = cfg->map;
-        auto substituteOverridesResult =
-            tint::core::ir::transform::SubstituteOverrides(ir.Get(), ir_cfg);
-        if (substituteOverridesResult != tint::Success) {
-            std::cerr << "Pipeline override substitution (IR) failed:\n"
-                      << substituteOverridesResult.Failure() << "\n";
-            return false;
-        }
+    // this needs to run after SingleEntryPoint transform which removes unused
+    // overrides for the current entry point.
+    auto substitute_override_cfg = CreateOverrideMap(options, inspector);
+    if (substitute_override_cfg != tint::Success) {
+        std::cerr << "Failed to create override map: " << substitute_override_cfg.Failure() << "\n";
+        return false;
+    }
+    auto substituteOverridesResult =
+        tint::core::ir::transform::SubstituteOverrides(ir.Get(), substitute_override_cfg.Get());
+    if (substituteOverridesResult != tint::Success) {
+        std::cerr << "Pipeline override substitution (IR) failed:\n"
+                  << substituteOverridesResult.Failure() << "\n";
+        return false;
     }
 
     {
@@ -1123,7 +1011,7 @@
 
     auto result = tint::msl::writer::Generate(ir.Get(), gen_options);
     if (result != tint::Success) {
-        tint::cmd::PrintWGSL(std::cerr, transform_res.Get());
+        tint::cmd::PrintWGSL(std::cerr, src_program);
         std::cerr << "Failed to generate: " << result.Failure() << "\n";
         return false;
     }
@@ -1181,13 +1069,6 @@
                   [[maybe_unused]] tint::inspector::Inspector& inspector,
                   [[maybe_unused]] tint::Program& src_program) {
 #if TINT_BUILD_HLSL_WRITER
-    std::optional<tint::ast::transform::SubstituteOverride::Config> cfg;
-    auto res = ProcessASTTransforms(options, inspector, src_program, cfg);
-    if (res != tint::Success) {
-        std::cerr << res.Failure() << "\n";
-        return true;
-    }
-
     const bool for_fxc = options.format == Format::kHlslFxc;
     // Set up the backend options.
     tint::hlsl::writer::Options gen_options;
@@ -1197,7 +1078,6 @@
     }
     gen_options.disable_robustness = !options.enable_robustness;
     gen_options.disable_workgroup_init = options.disable_workgroup_init;
-    gen_options.bindings = tint::hlsl::writer::GenerateBindings(res.Get());
     gen_options.pixel_local = options.pixel_local_options;
     gen_options.polyfill_dot_4x8_packed = options.hlsl_shader_model < kMinShaderModelForDP4aInHLSL;
     gen_options.polyfill_pack_unpack_4x8 =
@@ -1205,52 +1085,48 @@
     gen_options.compiler = for_fxc ? tint::hlsl::writer::Options::Compiler::kFXC
                                    : tint::hlsl::writer::Options::Compiler::kDXC;
 
-    tint::Result<tint::hlsl::writer::Output> result;
-    if (options.use_ir) {
-        // Convert the AST program to an IR module.
-        auto ir = tint::wgsl::reader::ProgramToLoweredIR(res.Get());
-        if (ir != tint::Success) {
-            std::cerr << "Failed to generate IR: " << ir << "\n";
-            return false;
-        }
+    // Convert the AST program to an IR module.
+    auto ir = tint::wgsl::reader::ProgramToLoweredIR(src_program);
+    if (ir != tint::Success) {
+        std::cerr << "Failed to generate IR: " << ir << "\n";
+        return false;
+    }
+    gen_options.bindings = tint::hlsl::writer::GenerateBindings(ir.Get());
 
-        if (options.ep_name != "") {
-            auto singleEntryPointResult =
-                tint::core::ir::transform::SingleEntryPoint(ir.Get(), options.ep_name);
-            if (singleEntryPointResult != tint::Success) {
-                std::cerr << "Pipeline single entry point (IR) failed:\n"
-                          << singleEntryPointResult.Failure() << "\n";
-            }
+    if (options.ep_name != "") {
+        auto singleEntryPointResult =
+            tint::core::ir::transform::SingleEntryPoint(ir.Get(), options.ep_name);
+        if (singleEntryPointResult != tint::Success) {
+            std::cerr << "Pipeline single entry point (IR) failed:\n"
+                      << singleEntryPointResult.Failure() << "\n";
         }
-
-        if (cfg) {
-            // this needs to run after SingleEntryPoint transform which removes unused
-            // overrides for the current entry point.
-            tint::core::ir::transform::SubstituteOverridesConfig ir_cfg;
-            ir_cfg.map = cfg->map;
-            auto substituteOverridesResult =
-                tint::core::ir::transform::SubstituteOverrides(ir.Get(), ir_cfg);
-            if (substituteOverridesResult != tint::Success) {
-                std::cerr << "Pipeline override substitution (IR) failed:\n"
-                          << substituteOverridesResult.Failure() << "\n";
-                return false;
-            }
-        }
-
-        // Check that the module and options are supported by the backend.
-        auto check = tint::hlsl::writer::CanGenerate(ir.Get(), gen_options);
-        if (check != tint::Success) {
-            std::cerr << check.Failure() << "\n";
-            return false;
-        }
-
-        result = tint::hlsl::writer::Generate(ir.Get(), gen_options);
-    } else {
-        result = tint::hlsl::writer::Generate(res.Get(), gen_options);
     }
 
+    // this needs to run after SingleEntryPoint transform which removes unused
+    // overrides for the current entry point.
+    auto substitute_override_cfg = CreateOverrideMap(options, inspector);
+    if (substitute_override_cfg != tint::Success) {
+        std::cerr << "Failed to create override map: " << substitute_override_cfg.Failure() << "\n";
+        return false;
+    }
+    auto substituteOverridesResult =
+        tint::core::ir::transform::SubstituteOverrides(ir.Get(), substitute_override_cfg.Get());
+    if (substituteOverridesResult != tint::Success) {
+        std::cerr << "Pipeline override substitution (IR) failed:\n"
+                  << substituteOverridesResult.Failure() << "\n";
+        return false;
+    }
+
+    // Check that the module and options are supported by the backend.
+    auto check = tint::hlsl::writer::CanGenerate(ir.Get(), gen_options);
+    if (check != tint::Success) {
+        std::cerr << check.Failure() << "\n";
+        return false;
+    }
+
+    auto result = tint::hlsl::writer::Generate(ir.Get(), gen_options);
     if (result != tint::Success) {
-        tint::cmd::PrintWGSL(std::cerr, res.Get());
+        tint::cmd::PrintWGSL(std::cerr, src_program);
         std::cerr << "Failed to generate: " << result.Failure() << "\n";
         return false;
     }
@@ -1276,7 +1152,7 @@
         auto dxc = tint::Command::LookPath(dxc_path);
         if (dxc.Found()) {
             uint32_t hlsl_shader_model = options.hlsl_shader_model;
-            auto enable_list = res->AST().Enables();
+            auto enable_list = src_program.AST().Enables();
             bool dxc_require_16bit_types = false;
             for (auto* enable : enable_list) {
                 if (enable->HasExtension(tint::wgsl::Extension::kF16)) {
@@ -1350,14 +1226,6 @@
                   [[maybe_unused]] tint::inspector::Inspector& inspector,
                   [[maybe_unused]] tint::Program& src_program) {
 #if TINT_BUILD_GLSL_WRITER
-
-    std::optional<tint::ast::transform::SubstituteOverride::Config> cfg;
-    auto res = ProcessASTTransforms(options, inspector, src_program, cfg);
-    if (res != tint::Success) {
-        std::cerr << res.Failure() << "\n";
-        return true;
-    }
-
     tint::glsl::writer::Options gen_options;
     gen_options.strip_all_names = options.rename_all;
     if (options.glsl_desktop) {
@@ -1390,7 +1258,7 @@
     }
 
     // Convert the AST program to an IR module.
-    auto ir = tint::wgsl::reader::ProgramToLoweredIR(res.Get());
+    auto ir = tint::wgsl::reader::ProgramToLoweredIR(src_program);
     if (ir != tint::Success) {
         std::cerr << "Failed to generate IR: " << ir << "\n";
         return false;
@@ -1405,19 +1273,21 @@
         }
     }
 
-    if (cfg) {
-        // this needs to run after SingleEntryPoint transform which removes unused
-        // overrides for the current entry point.
-        tint::core::ir::transform::SubstituteOverridesConfig ir_cfg;
-        ir_cfg.map = cfg->map;
-        auto substituteOverridesResult =
-            tint::core::ir::transform::SubstituteOverrides(ir.Get(), ir_cfg);
-        if (substituteOverridesResult != tint::Success) {
-            std::cerr << "Pipeline override substitution (IR) failed:\n"
-                      << substituteOverridesResult.Failure() << "\n";
-            return false;
-        }
+    // this needs to run after SingleEntryPoint transform which removes unused
+    // overrides for the current entry point.
+    auto substitute_override_cfg = CreateOverrideMap(options, inspector);
+    if (substitute_override_cfg != tint::Success) {
+        std::cerr << "Failed to create override map: " << substitute_override_cfg.Failure() << "\n";
+        return false;
     }
+    auto substituteOverridesResult =
+        tint::core::ir::transform::SubstituteOverrides(ir.Get(), substitute_override_cfg.Get());
+    if (substituteOverridesResult != tint::Success) {
+        std::cerr << "Pipeline override substitution (IR) failed:\n"
+                  << substituteOverridesResult.Failure() << "\n";
+        return false;
+    }
+
     // Generate binding options.
     gen_options.bindings = tint::glsl::writer::GenerateBindings(ir.Get());
 
@@ -1525,17 +1395,11 @@
         options.format = Format::kSpvAsm;
     }
 
-    // TODO(crbug.com/344563756): Remove the user option for 'use_ir' once the ir is launched on all
-    // backends.
-    if (options.format != Format::kHlsl && options.format != Format::kHlslFxc) {
-        options.use_ir = true;
-    }
-
     tint::cmd::LoadProgramOptions opts;
     opts.filename = options.input_filename;
     opts.printer = options.printer.get();
 #if TINT_BUILD_SPV_READER
-    opts.use_ir = options.use_ir_reader;
+    opts.use_ir_reader = options.use_ir_reader;
     opts.spirv_reader_options = options.spirv_reader_options;
     // Allow the shader-f16 extension
     opts.spirv_reader_options.allowed_features = tint::wgsl::AllowedFeatures::Everything();
diff --git a/src/tint/lang/hlsl/writer/helpers/generate_bindings.cc b/src/tint/lang/hlsl/writer/helpers/generate_bindings.cc
index 940eb79..8325945 100644
--- a/src/tint/lang/hlsl/writer/helpers/generate_bindings.cc
+++ b/src/tint/lang/hlsl/writer/helpers/generate_bindings.cc
@@ -119,78 +119,4 @@
     return bindings;
 }
 
-Bindings GenerateBindings(const Program& program) {
-    // TODO(tint:1491): Use Inspector once we can get binding info for all
-    // variables, not just those referenced by entry points.
-
-    Bindings bindings{};
-
-    // Collect next valid binding number per group
-    Hashmap<uint32_t, uint32_t, 4> group_to_next_binding_number;
-    Vector<tint::BindingPoint, 4> ext_tex_bps;
-    for (auto* var : program.AST().GlobalVariables()) {
-        if (auto* sem_var = program.Sem().Get(var)->As<sem::GlobalVariable>()) {
-            if (auto bp = sem_var->Attributes().binding_point) {
-                if (auto val = group_to_next_binding_number.Get(bp->group)) {
-                    *val = std::max(*val, bp->binding + 1);
-                } else {
-                    group_to_next_binding_number.Add(bp->group, bp->binding + 1);
-                }
-
-                // Store up the external textures, we'll add them in the next step
-                if (sem_var->Type()->UnwrapRef()->Is<core::type::ExternalTexture>()) {
-                    ext_tex_bps.Push(*bp);
-                    continue;
-                }
-
-                binding::BindingInfo info{bp->group, bp->binding};
-                switch (sem_var->AddressSpace()) {
-                    case core::AddressSpace::kHandle:
-                        Switch(
-                            sem_var->Type()->UnwrapRef(),  //
-                            [&](const core::type::Sampler*) {
-                                bindings.sampler.emplace(*bp, info);
-                            },
-                            [&](const core::type::StorageTexture*) {
-                                bindings.storage_texture.emplace(*bp, info);
-                            },
-                            [&](const core::type::Texture*) {
-                                bindings.texture.emplace(*bp, info);
-                            });
-                        break;
-                    case core::AddressSpace::kStorage:
-                        bindings.storage.emplace(*bp, info);
-                        break;
-                    case core::AddressSpace::kUniform:
-                        bindings.uniform.emplace(*bp, info);
-                        break;
-
-                    case core::AddressSpace::kUndefined:
-                    case core::AddressSpace::kPixelLocal:
-                    case core::AddressSpace::kPrivate:
-                    case core::AddressSpace::kImmediate:
-                    case core::AddressSpace::kIn:
-                    case core::AddressSpace::kOut:
-                    case core::AddressSpace::kFunction:
-                    case core::AddressSpace::kWorkgroup:
-                        break;
-                }
-            }
-        }
-    }
-
-    for (auto bp : ext_tex_bps) {
-        uint32_t g = bp.group;
-        uint32_t& next_num = group_to_next_binding_number.GetOrAddZero(g);
-
-        binding::BindingInfo plane0{bp.group, bp.binding};
-        binding::BindingInfo plane1{g, next_num++};
-        binding::BindingInfo metadata{g, next_num++};
-
-        bindings.external_texture.emplace(bp, binding::ExternalTexture{metadata, plane0, plane1});
-    }
-
-    return bindings;
-}
-
 }  // namespace tint::hlsl::writer
diff --git a/src/tint/lang/hlsl/writer/helpers/generate_bindings.h b/src/tint/lang/hlsl/writer/helpers/generate_bindings.h
index 72abac8..fef4e4f 100644
--- a/src/tint/lang/hlsl/writer/helpers/generate_bindings.h
+++ b/src/tint/lang/hlsl/writer/helpers/generate_bindings.h
@@ -31,10 +31,6 @@
 #include "src/tint/lang/hlsl/writer/common/options.h"
 
 // Forward declarations
-namespace tint {
-class Program;
-}
-
 namespace tint::core::ir {
 class Module;
 }  // namespace tint::core::ir
@@ -46,11 +42,6 @@
 /// @returns the bindings
 Bindings GenerateBindings(const core::ir::Module& module);
 
-/// Generate the resource bindings
-/// @param program the program to generate from
-/// @returns the bindings
-Bindings GenerateBindings(const Program& program);
-
 }  // namespace tint::hlsl::writer
 
 #endif  // SRC_TINT_LANG_HLSL_WRITER_HELPERS_GENERATE_BINDINGS_H_
diff --git a/tools/src/cmd/tests/main.go b/tools/src/cmd/tests/main.go
index ac4966f..f07dc90 100644
--- a/tools/src/cmd/tests/main.go
+++ b/tools/src/cmd/tests/main.go
@@ -74,7 +74,7 @@
 )
 
 // allOutputFormats holds all the supported outputFormats
-var allOutputFormats = []outputFormat{wgsl, spvasm, msl, hlslDXC, hlslDXCIR, hlslFXC, hlslFXCIR, glsl}
+var allOutputFormats = []outputFormat{wgsl, spvasm, msl, hlslDXC, hlslFXC, glsl}
 
 // The default non-flag arguments to the command
 var defaultArgs = []string{"test/tint"}
@@ -240,6 +240,10 @@
 			if err != nil {
 				return err
 			}
+			// TODO(421916945): Remove when CQ is updated to stop using these formats.
+			if parsed[0] == hlslDXCIR || parsed[0] == hlslFXCIR {
+				continue
+			}
 			formats = append(formats, parsed...)
 		}
 	}
@@ -699,16 +703,11 @@
 			return status{code: skip, timeTaken: 0}
 		}
 
-		useIr := j.format == hlslDXCIR || j.format == hlslFXCIR
-
+		// TODO(421916945): Remove when IR expectations have been moved.
 		switch j.format {
 		case hlslDXC:
-			expectedFilePath += "dxc.hlsl"
-		case hlslDXCIR:
 			expectedFilePath += "ir.dxc.hlsl"
 		case hlslFXC:
-			expectedFilePath += "fxc.hlsl"
-		case hlslFXCIR:
 			expectedFilePath += "ir.fxc.hlsl"
 		default:
 			expectedFilePath += string(j.format)
@@ -758,10 +757,6 @@
 			"--print-hash",
 		}
 
-		if useIr {
-			args = append(args, "--use-ir")
-		}
-
 		if cfg.useIrReader {
 			args = append(args, "--use-ir-reader")
 		}
@@ -782,12 +777,12 @@
 		case spvasm, glsl:
 			args = append(args, "--validate") // spirv-val and glslang are statically linked, always available
 			validate = true
-		case hlslDXC, hlslDXCIR:
+		case hlslDXC:
 			if cfg.dxcPath != "" {
 				args = append(args, "--dxc", cfg.dxcPath)
 				validate = true
 			}
-		case hlslFXC, hlslFXCIR:
+		case hlslFXC:
 			if cfg.fxcPath != "" {
 				args = append(args, "--fxc", cfg.fxcPath)
 				validate = true