tint: Fix phony assignments in DemoteToHelper

We just need to skip these.

Bug: tint:1723
Change-Id: I311fe0432ecf1f69936eaf08eb57123a6a738175
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/109340
Auto-Submit: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/transform/demote_to_helper.cc b/src/tint/transform/demote_to_helper.cc
index 2516a76..f6d2388 100644
--- a/src/tint/transform/demote_to_helper.cc
+++ b/src/tint/transform/demote_to_helper.cc
@@ -114,6 +114,11 @@
                     return;
                 }
 
+                // Skip phony assignments.
+                if (assign->lhs->Is<ast::PhonyExpression>()) {
+                    return;
+                }
+
                 // Skip writes to invocation-private address spaces.
                 auto* ref = sem.Get(assign->lhs)->Type()->As<sem::Reference>();
                 switch (ref->AddressSpace()) {
diff --git a/src/tint/transform/demote_to_helper_test.cc b/src/tint/transform/demote_to_helper_test.cc
index e493410..59754aa 100644
--- a/src/tint/transform/demote_to_helper_test.cc
+++ b/src/tint/transform/demote_to_helper_test.cc
@@ -1096,5 +1096,36 @@
     EXPECT_EQ(expect, str(got));
 }
 
+TEST_F(DemoteToHelperTest, PhonyAssignment) {
+    auto* src = R"(
+@fragment
+fn foo(@location(0) in : f32) {
+  if (in == 0.0) {
+    discard;
+  }
+  _ = in;
+}
+)";
+
+    auto* expect = R"(
+var<private> tint_discarded = false;
+
+@fragment
+fn foo(@location(0) in : f32) {
+  if ((in == 0.0)) {
+    tint_discarded = true;
+  }
+  _ = in;
+  if (tint_discarded) {
+    discard;
+  }
+}
+)";
+
+    auto got = Run<DemoteToHelper>(src);
+
+    EXPECT_EQ(expect, str(got));
+}
+
 }  // namespace
 }  // namespace tint::transform