[ir] Convert BuiltinPolyfillSpirv to a free function

The LiteralOperand and SampleImage classes remain in the transform's
header for now, and will be moved into the `lang/spirv/` directory
once the SPIR-V specific transforms have been moved to
`lang/spirv/raise/`.

Bug: tint:1718
Change-Id: I8b203a6390b288af5d20e6f0fe8bd54c2bb16ad5
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/143826
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.cc b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.cc
index 926045e..ebef77a 100644
--- a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.cc
+++ b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.cc
@@ -19,6 +19,7 @@
 #include "spirv/unified1/spirv.h"
 #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/core/type/builtin_structs.h"
 #include "src/tint/lang/core/type/depth_multisampled_texture.h"
 #include "src/tint/lang/core/type/depth_texture.h"
@@ -28,20 +29,17 @@
 #include "src/tint/lang/core/type/texture.h"
 #include "src/tint/utils/ice/ice.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::BuiltinPolyfillSpirv);
-TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::BuiltinPolyfillSpirv::LiteralOperand);
-TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::BuiltinPolyfillSpirv::SampledImage);
+TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::LiteralOperand);
+TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::SampledImage);
 
 using namespace tint::number_suffixes;  // NOLINT
 
 namespace tint::ir::transform {
 
-BuiltinPolyfillSpirv::BuiltinPolyfillSpirv() = default;
-
-BuiltinPolyfillSpirv::~BuiltinPolyfillSpirv() = default;
+namespace {
 
 /// PIMPL state for the transform.
-struct BuiltinPolyfillSpirv::State {
+struct State {
     /// The IR module.
     Module* ir = nullptr;
 
@@ -803,24 +801,31 @@
     }
 };
 
-void BuiltinPolyfillSpirv::Run(ir::Module* ir) const {
+}  // namespace
+
+Result<SuccessType, std::string> BuiltinPolyfillSpirv(Module* ir) {
+    auto result = ValidateAndDumpIfNeeded(*ir, "BuiltinPolyfillSpirv transform");
+    if (!result) {
+        return result;
+    }
+
     State{ir}.Process();
+
+    return Success;
 }
 
-BuiltinPolyfillSpirv::LiteralOperand::LiteralOperand(const constant::Value* value) : Base(value) {}
+LiteralOperand::LiteralOperand(const constant::Value* value) : Base(value) {}
 
-BuiltinPolyfillSpirv::LiteralOperand::~LiteralOperand() = default;
+LiteralOperand::~LiteralOperand() = default;
 
-BuiltinPolyfillSpirv::SampledImage::SampledImage(const type::Type* image)
-    : Base(static_cast<size_t>(
-               Hash(tint::TypeInfo::Of<BuiltinPolyfillSpirv::SampledImage>().full_hashcode, image)),
+SampledImage::SampledImage(const type::Type* image)
+    : Base(static_cast<size_t>(Hash(tint::TypeInfo::Of<SampledImage>().full_hashcode, image)),
            type::Flags{}),
       image_(image) {}
 
-BuiltinPolyfillSpirv::SampledImage* BuiltinPolyfillSpirv::SampledImage::Clone(
-    type::CloneContext& ctx) const {
+SampledImage* SampledImage::Clone(type::CloneContext& ctx) const {
     auto* image = image_->Clone(ctx);
-    return ctx.dst.mgr->Get<BuiltinPolyfillSpirv::SampledImage>(image);
+    return ctx.dst.mgr->Get<SampledImage>(image);
 }
 
 }  // namespace tint::ir::transform
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.h b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.h
index 3433f23..b9dcc40 100644
--- a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.h
+++ b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv.h
@@ -18,68 +18,59 @@
 #include <string>
 
 #include "src/tint/lang/core/ir/constant.h"
-#include "src/tint/lang/core/ir/transform/transform.h"
 #include "src/tint/lang/core/type/type.h"
+#include "src/tint/utils/result/result.h"
 
-// Forward declarations
-namespace tint::type {
+// Forward declarations.
+namespace tint::ir {
+class Module;
 class Texture;
-}  // namespace tint::type
+}  // namespace tint::ir
 
 namespace tint::ir::transform {
 
 /// BuiltinPolyfillSpirv is a transform that replaces calls to builtins with polyfills and calls to
 /// SPIR-V backend intrinsic functions.
-class BuiltinPolyfillSpirv final : public Castable<BuiltinPolyfillSpirv, Transform> {
+/// @param module the module to transform
+/// @returns an error string on failure
+Result<SuccessType, std::string> BuiltinPolyfillSpirv(Module* module);
+
+/// LiteralOperand is a type of constant value that is intended to be emitted as a literal in
+/// the SPIR-V instruction stream.
+/// TODO(jrprice): Move this to lang/spirv.
+class LiteralOperand final : public Castable<LiteralOperand, ir::Constant> {
   public:
     /// Constructor
-    BuiltinPolyfillSpirv();
+    /// @param value the operand value
+    explicit LiteralOperand(const constant::Value* value);
     /// Destructor
-    ~BuiltinPolyfillSpirv() override;
+    ~LiteralOperand() override;
+};
 
-    /// @copydoc Transform::Run
-    void Run(ir::Module* module) const override;
+/// SampledImage represents an OpTypeSampledImage in SPIR-V.
+/// TODO(jrprice): Move this to lang/spirv.
+class SampledImage final : public Castable<SampledImage, type::Type> {
+  public:
+    /// Constructor
+    /// @param image the image type
+    explicit SampledImage(const type::Type* image);
 
-    /// LiteralOperand is a type of constant value that is intended to be emitted as a literal in
-    /// the SPIR-V instruction stream.
-    class LiteralOperand final : public Castable<LiteralOperand, ir::Constant> {
-      public:
-        /// Constructor
-        /// @param value the operand value
-        explicit LiteralOperand(const constant::Value* value);
-        /// Destructor
-        ~LiteralOperand() override;
-    };
+    /// @param other the other node to compare against
+    /// @returns true if the this type is equal to @p other
+    bool Equals(const UniqueNode& other) const override { return &other.TypeInfo() == &TypeInfo(); }
 
-    /// SampledImage represents an OpTypeSampledImage in SPIR-V.
-    class SampledImage final : public Castable<SampledImage, type::Type> {
-      public:
-        /// Constructor
-        /// @param image the image type
-        explicit SampledImage(const type::Type* image);
+    /// @returns the friendly name for this type
+    std::string FriendlyName() const override { return "spirv.sampled_image"; }
 
-        /// @param other the other node to compare against
-        /// @returns true if the this type is equal to @p other
-        bool Equals(const UniqueNode& other) const override {
-            return &other.TypeInfo() == &TypeInfo();
-        }
+    /// @param ctx the clone context
+    /// @returns a clone of this type
+    SampledImage* Clone(type::CloneContext& ctx) const override;
 
-        /// @returns the friendly name for this type
-        std::string FriendlyName() const override { return "spirv.sampled_image"; }
-
-        /// @param ctx the clone context
-        /// @returns a clone of this type
-        SampledImage* Clone(type::CloneContext& ctx) const override;
-
-        /// @returns the image type
-        const type::Type* Image() const { return image_; }
-
-      private:
-        const type::Type* image_;
-    };
+    /// @returns the image type
+    const type::Type* Image() const { return image_; }
 
   private:
-    struct State;
+    const type::Type* image_;
 };
 
 }  // namespace tint::ir::transform
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv_test.cc b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv_test.cc
index 41119b9..06e279d 100644
--- a/src/tint/lang/core/ir/transform/builtin_polyfill_spirv_test.cc
+++ b/src/tint/lang/core/ir/transform/builtin_polyfill_spirv_test.cc
@@ -92,7 +92,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -162,7 +162,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -232,7 +232,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -278,7 +278,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -322,7 +322,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -366,7 +366,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -427,7 +427,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -471,7 +471,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -513,7 +513,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -557,7 +557,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -601,7 +601,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -645,7 +645,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -689,7 +689,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -733,7 +733,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -777,7 +777,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -821,7 +821,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -865,7 +865,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -900,7 +900,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -941,7 +941,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -990,7 +990,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1026,7 +1026,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1062,7 +1062,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1099,7 +1099,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1136,7 +1136,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1176,7 +1176,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1217,7 +1217,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1255,7 +1255,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1292,7 +1292,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1330,7 +1330,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1368,7 +1368,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1408,7 +1408,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1451,7 +1451,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1491,7 +1491,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1532,7 +1532,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1576,7 +1576,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1615,7 +1615,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1655,7 +1655,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1698,7 +1698,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1737,7 +1737,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1777,7 +1777,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1820,7 +1820,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1861,7 +1861,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1903,7 +1903,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1949,7 +1949,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -1989,7 +1989,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2030,7 +2030,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2074,7 +2074,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2114,7 +2114,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2155,7 +2155,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2199,7 +2199,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2236,7 +2236,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2275,7 +2275,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2315,7 +2315,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2357,7 +2357,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2396,7 +2396,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2438,7 +2438,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2481,7 +2481,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2516,7 +2516,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2552,7 +2552,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2588,7 +2588,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2623,7 +2623,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2659,7 +2659,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2695,7 +2695,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2730,7 +2730,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2765,7 +2765,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
@@ -2803,7 +2803,7 @@
 }
 )";
 
-    Run<BuiltinPolyfillSpirv>();
+    Run(BuiltinPolyfillSpirv);
 
     EXPECT_EQ(expect, str());
 }
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index 2003cb0..e96f5e1 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -107,8 +107,8 @@
 
     ir::transform::AddEmptyEntryPoint{}.Run(module);
     ir::transform::BlockDecoratedStructs{}.Run(module);
-    ir::transform::BuiltinPolyfillSpirv{}.Run(module);
 
+    RUN_TRANSFORM(BuiltinPolyfillSpirv);
     RUN_TRANSFORM(DemoteToHelper);
     RUN_TRANSFORM(ExpandImplicitSplats);
     RUN_TRANSFORM(HandleMatrixArithmetic);
@@ -169,10 +169,10 @@
         },
 
         // Dedup a SampledImage if its underlying image will be deduped.
-        [&](const ir::transform::BuiltinPolyfillSpirv::SampledImage* si) -> const type::Type* {
+        [&](const ir::transform::SampledImage* si) -> const type::Type* {
             auto* img = DedupType(si->Image(), types);
             if (img != si->Image()) {
-                return types.Get<ir::transform::BuiltinPolyfillSpirv::SampledImage>(img);
+                return types.Get<ir::transform::SampledImage>(img);
             }
             return si;
         },
@@ -271,7 +271,7 @@
 
 uint32_t Printer::Constant(ir::Constant* constant) {
     // If it is a literal operand, just return the value.
-    if (auto* literal = constant->As<ir::transform::BuiltinPolyfillSpirv::LiteralOperand>()) {
+    if (auto* literal = constant->As<ir::transform::LiteralOperand>()) {
         return literal->Value()->ValueAs<uint32_t>();
     }
 
@@ -412,7 +412,7 @@
             [&](const type::Struct* str) { EmitStructType(id, str, addrspace); },
             [&](const type::Texture* tex) { EmitTextureType(id, tex); },
             [&](const type::Sampler*) { module_.PushType(spv::Op::OpTypeSampler, {id}); },
-            [&](const ir::transform::BuiltinPolyfillSpirv::SampledImage* s) {
+            [&](const ir::transform::SampledImage* s) {
                 module_.PushType(spv::Op::OpTypeSampledImage, {id, Type(s->Image())});
             },
             [&](Default) { TINT_ICE() << "unhandled type: " << ty->FriendlyName(); });