[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};