[hlsl] Fix struct splats in PromoteInitializers

We do not allow splats for structures on `construct` instructions, so
expand the argument list to match the structure member count.

Fixed: 351700182
Change-Id: I554f64d8eccdaeabcceb4ba66e5d2670ae7ecd06
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/198116
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Auto-Submit: James Price <jrprice@google.com>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/lang/hlsl/writer/raise/promote_initializers.cc b/src/tint/lang/hlsl/writer/raise/promote_initializers.cc
index bb5a529..a996b5b 100644
--- a/src/tint/lang/hlsl/writer/raise/promote_initializers.cc
+++ b/src/tint/lang/hlsl/writer/raise/promote_initializers.cc
@@ -188,7 +188,9 @@
                 args.Push(b.Constant(v));
             }
         } else if (auto* splat_val = val->Value()->As<core::constant::Splat>()) {
-            args.Push(b.Constant(splat_val->el));
+            for (uint32_t i = 0; i < splat_val->NumElements(); i++) {
+                args.Push(b.Constant(splat_val->el));
+            }
         }
         return args;
     }
diff --git a/src/tint/lang/hlsl/writer/raise/promote_initializers_test.cc b/src/tint/lang/hlsl/writer/raise/promote_initializers_test.cc
index b3f3464..b4a8b19 100644
--- a/src/tint/lang/hlsl/writer/raise/promote_initializers_test.cc
+++ b/src/tint/lang/hlsl/writer/raise/promote_initializers_test.cc
@@ -313,6 +313,50 @@
     EXPECT_EQ(expect, str());
 }
 
+TEST_F(HlslWriterPromoteInitializersTest, ModuleScopedStruct_SplatMultipleElements) {
+    capabilities = core::ir::Capabilities{core::ir::Capability::kAllowModuleScopeLets};
+
+    auto* str_ty = ty.Struct(mod.symbols.New("S"), {
+                                                       {mod.symbols.New("a"), ty.i32()},
+                                                       {mod.symbols.New("b"), ty.i32()},
+                                                       {mod.symbols.New("c"), ty.i32()},
+                                                   });
+
+    b.ir.root_block->Append(b.Var<private_>("a", b.Splat(str_ty, 1_i)));
+
+    auto* src = R"(
+S = struct @align(4) {
+  a:i32 @offset(0)
+  b:i32 @offset(4)
+  c:i32 @offset(8)
+}
+
+$B1: {  # root
+  %a:ptr<private, S, read_write> = var, S(1i)
+}
+
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+S = struct @align(4) {
+  a:i32 @offset(0)
+  b:i32 @offset(4)
+  c:i32 @offset(8)
+}
+
+$B1: {  # root
+  %1:S = construct 1i, 1i, 1i
+  %2:S = let %1
+  %a:ptr<private, S, read_write> = var, %2
+}
+
+)";
+    Run(PromoteInitializers);
+
+    EXPECT_EQ(expect, str());
+}
+
 TEST_F(HlslWriterPromoteInitializersTest, ModuleScopedArray) {
     capabilities = core::ir::Capabilities{core::ir::Capability::kAllowModuleScopeLets};