Do not put handles into lets/phonys when moving back to WGSL.

When converting from IR to WGSL, avoid putting any handle types into
lets/phonys. The `let` in WGSL can not take a `handle` type.

Change-Id: Ic4d8fcb559bf57ff777df66bccb784073f8108bf
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/245094
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/wgsl/writer/raise/value_to_let.cc b/src/tint/lang/wgsl/writer/raise/value_to_let.cc
index 5e5755a..878efa0 100644
--- a/src/tint/lang/wgsl/writer/raise/value_to_let.cc
+++ b/src/tint/lang/wgsl/writer/raise/value_to_let.cc
@@ -165,6 +165,10 @@
         if (inst->IsAnyOf<core::ir::Var, core::ir::Let, core::ir::Phony>()) {
             return;
         }
+        // Never put handle types in lets or phonys
+        if (inst->Result()->Type()->IsHandle()) {
+            return;
+        }
         if (inst->Is<core::ir::Call>() && !value->IsUsed()) {
             bool must_use =
                 inst->Is<core::ir::BuiltinCall>() && !value->Type()->Is<core::type::Void>();
diff --git a/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc b/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc
index 9cf5e38..d452454 100644
--- a/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc
+++ b/src/tint/lang/wgsl/writer/raise/value_to_let_test.cc
@@ -30,6 +30,7 @@
 #include <utility>
 
 #include "src/tint/lang/core/ir/transform/helper_test.h"
+#include "src/tint/lang/core/type/sampled_texture.h"
 
 namespace tint::wgsl::writer::raise {
 namespace {
@@ -2689,5 +2690,71 @@
     EXPECT_EQ(expect, str());
 }
 
+/////////////////////////
+// Load handle
+/////////////////////////
+TEST_F(WgslWriter_ValueToLetTest, Load_Handle) {
+    core::ir::Var* tex = nullptr;
+    core::ir::Var* sampler = nullptr;
+    b.Append(b.ir.root_block, [&] {
+        tex = b.Var("tex",
+                    ty.ptr(handle, ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()),
+                           core::Access::kRead));
+        tex->SetBindingPoint(0, 0);
+
+        sampler = b.Var(ty.ptr(handle, ty.sampler()));
+        sampler->SetBindingPoint(0, 1);
+    });
+
+    auto* fn = b.Function("f", ty.void_());
+    b.Append(fn->Block(), [&] {
+        auto* ls = b.Load(sampler);
+        auto* lt = b.Load(tex);
+        auto* r = b.Call(ty.vec4<f32>(), core::BuiltinFn::kTextureSample, lt, ls,
+                         b.Splat<vec2<f32>>(0_f));
+        b.ir.SetName(r, "r");
+        b.Return(fn);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %tex:ptr<handle, texture_2d<f32>, read> = var undef @binding_point(0, 0)
+  %2:ptr<handle, sampler, read> = var undef @binding_point(0, 1)
+}
+
+%f = func():void {
+  $B2: {
+    %4:sampler = load %2
+    %5:texture_2d<f32> = load %tex
+    %r:vec4<f32> = textureSample %5, %4, vec2<f32>(0.0f)
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+$B1: {  # root
+  %tex:ptr<handle, texture_2d<f32>, read> = var undef @binding_point(0, 0)
+  %2:ptr<handle, sampler, read> = var undef @binding_point(0, 1)
+}
+
+%f = func():void {
+  $B2: {
+    %4:sampler = load %2
+    %5:texture_2d<f32> = load %tex
+    %6:vec4<f32> = textureSample %5, %4, vec2<f32>(0.0f)
+    %r:vec4<f32> = let %6
+    ret
+  }
+}
+)";
+
+    Run(ValueToLet);
+
+    EXPECT_EQ(expect, str());
+}
+
 }  // namespace
 }  // namespace tint::wgsl::writer::raise