[msl] If no dynamic buffer given, just return the access.

In the case where a group is provided, and we're in an entry point, we
should get a dynamic buffer, but if it isn't provided (this can happen
through clusterfuzz) then just return the original access.

Fixed: 443418986
Change-Id: I8e0acb8b299998c2281c8ffb9c665f45f7bd0d72
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/261438
Reviewed-by: James Price <jrprice@google.com>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/lang/msl/writer/raise/argument_buffers.cc b/src/tint/lang/msl/writer/raise/argument_buffers.cc
index a14bf5a..044ba62 100644
--- a/src/tint/lang/msl/writer/raise/argument_buffers.cc
+++ b/src/tint/lang/msl/writer/raise/argument_buffers.cc
@@ -345,10 +345,10 @@
                 return access->Result();
             }
 
-            TINT_ASSERT(group_to_dynamic_offset_buffer.Contains(group));
-
             core::ir::Value* offset_buffer = group_to_dynamic_offset_buffer.GetOr(group, nullptr);
-            TINT_ASSERT(offset_buffer);
+            if (!offset_buffer) {
+                return access->Result();
+            }
 
             core::ir::Value* result = nullptr;
             b.InsertAfter(access, [&] {
diff --git a/src/tint/lang/msl/writer/raise/argument_buffers_test.cc b/src/tint/lang/msl/writer/raise/argument_buffers_test.cc
index b56c6ee..c3a92db 100644
--- a/src/tint/lang/msl/writer/raise/argument_buffers_test.cc
+++ b/src/tint/lang/msl/writer/raise/argument_buffers_test.cc
@@ -1726,5 +1726,64 @@
     EXPECT_EQ(expect, str());
 }
 
+TEST_F(MslWriter_ArgumentBuffersTest, NoDynamicOffset) {
+    auto* var_a = b.Var("a", ty.ptr<storage, i32, core::Access::kReadWrite>());
+    var_a->SetBindingPoint(1, 2);
+    mod.root_block->Append(var_a);
+
+    auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
+    b.Append(func->Block(), [&] {
+        auto* load_a = b.Load(var_a);
+        auto* add = b.Add<i32>(load_a, load_a);
+        b.Store(var_a, add);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+$B1: {  # root
+  %a:ptr<storage, i32, read_write> = var undef @binding_point(1, 2)
+}
+
+%foo = @fragment func():void {
+  $B2: {
+    %3:i32 = load %a
+    %4:i32 = add %3, %3
+    store %a, %4
+    ret
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+tint_arg_buffer_struct_1 = struct @align(1), @core.explicit_layout {
+  a:ptr<storage, i32, read_write> @offset(0), @binding_point(1, 2)
+}
+
+%foo = @fragment func(%tint_arg_buffer_1:ptr<uniform, tint_arg_buffer_struct_1, read> [@binding_point(0, 2)]):void {
+  $B1: {
+    %3:tint_arg_buffer_struct_1 = load %tint_arg_buffer_1
+    %4:ptr<storage, i32, read_write> = access %3, 0u
+    %5:i32 = load %4
+    %6:i32 = add %5, %5
+    %7:ptr<storage, i32, read_write> = access %3, 0u
+    store %7, %6
+    ret
+  }
+}
+)";
+
+    ArgumentBufferInfo info{
+        .id = 2,
+        .binding_info_to_offset_index = {{2, 3}},
+    };
+
+    ArgumentBuffersConfig cfg{};
+    cfg.group_to_argument_buffer_info.insert({1, info});
+    Run(ArgumentBuffers, cfg);
+
+    EXPECT_EQ(expect, str());
+}
+
 }  // namespace
 }  // namespace tint::msl::writer::raise