From 0eb4d04d83e8f1565e9dc527f6d84fdbc0268aa8 Mon Sep 17 00:00:00 2001 From: James Price Date: Thu, 25 May 2023 03:24:19 +0000 Subject: [PATCH] [ir][spirv-writer] Expand binary arithmetic tests Use the parameterized test helper for binary expressions to more comprehensively test scalar and vector values across different types. Bug: tint:1906 Change-Id: I2be087d7889d0993125eb0e3f897acbdf56575b2 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/134323 Reviewed-by: Ben Clayton Kokoro: James Price Commit-Queue: James Price --- .../spirv/ir/generator_impl_ir_binary_test.cc | 208 +++--------------- 1 file changed, 32 insertions(+), 176 deletions(-) diff --git a/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc b/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc index 3caf52880a..71a2a36bf2 100644 --- a/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc +++ b/src/tint/writer/spirv/ir/generator_impl_ir_binary_test.cc @@ -117,196 +117,52 @@ class BinaryInstructionTest : public SpvGeneratorImplTestWithParamStartTarget()->SetInstructions(utils::Vector{ - b.Add(mod.Types().i32(), b.Constant(1_i), b.Constant(2_i)), b.Branch(func->EndTarget())}); +using Arithmetic = BinaryInstructionTest; +TEST_P(Arithmetic, Scalar) { + auto params = GetParam(); - generator_.EmitFunction(func); - EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo" -%2 = OpTypeVoid -%3 = OpTypeFunction %2 -%6 = OpTypeInt 32 1 -%7 = OpConstant %6 1 -%8 = OpConstant %6 2 -%1 = OpFunction %2 None %3 -%4 = OpLabel -%5 = OpIAdd %6 %7 %8 -OpReturn -OpFunctionEnd -)"); -} - -TEST_F(SpvGeneratorImplTest, Binary_Add_U32) { - auto* func = b.CreateFunction("foo", mod.Types().void_()); - func->StartTarget()->SetInstructions(utils::Vector{ - b.Add(mod.Types().u32(), b.Constant(1_u), b.Constant(2_u)), b.Branch(func->EndTarget())}); - - generator_.EmitFunction(func); - EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo" -%2 = OpTypeVoid -%3 = OpTypeFunction %2 -%6 = OpTypeInt 32 0 -%7 = OpConstant %6 1 -%8 = OpConstant %6 2 -%1 = OpFunction %2 None %3 -%4 = OpLabel -%5 = OpIAdd %6 %7 %8 -OpReturn -OpFunctionEnd -)"); -} - -TEST_F(SpvGeneratorImplTest, Binary_Add_F32) { - auto* func = b.CreateFunction("foo", mod.Types().void_()); - func->StartTarget()->SetInstructions(utils::Vector{ - b.Add(mod.Types().f32(), b.Constant(1_f), b.Constant(2_f)), b.Branch(func->EndTarget())}); - - generator_.EmitFunction(func); - EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo" -%2 = OpTypeVoid -%3 = OpTypeFunction %2 -%6 = OpTypeFloat 32 -%7 = OpConstant %6 1 -%8 = OpConstant %6 2 -%1 = OpFunction %2 None %3 -%4 = OpLabel -%5 = OpFAdd %6 %7 %8 -OpReturn -OpFunctionEnd -)"); -} - -TEST_F(SpvGeneratorImplTest, Binary_Sub_I32) { auto* func = b.CreateFunction("foo", mod.Types().void_()); func->StartTarget()->SetInstructions( - utils::Vector{b.Subtract(mod.Types().i32(), b.Constant(1_i), b.Constant(2_i)), + utils::Vector{b.CreateBinary(params.kind, MakeScalarType(params.type), + MakeScalarValue(params.type), MakeScalarValue(params.type)), b.Branch(func->EndTarget())}); generator_.EmitFunction(func); - EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo" -%2 = OpTypeVoid -%3 = OpTypeFunction %2 -%6 = OpTypeInt 32 1 -%7 = OpConstant %6 1 -%8 = OpConstant %6 2 -%1 = OpFunction %2 None %3 -%4 = OpLabel -%5 = OpISub %6 %7 %8 -OpReturn -OpFunctionEnd -)"); + EXPECT_THAT(DumpModule(generator_.Module()), ::testing::HasSubstr(params.spirv_inst)); } +TEST_P(Arithmetic, Vector) { + auto params = GetParam(); -TEST_F(SpvGeneratorImplTest, Binary_Sub_U32) { auto* func = b.CreateFunction("foo", mod.Types().void_()); func->StartTarget()->SetInstructions( - utils::Vector{b.Subtract(mod.Types().u32(), b.Constant(1_u), b.Constant(2_u)), + utils::Vector{b.CreateBinary(params.kind, MakeVectorType(params.type), + MakeVectorValue(params.type), MakeVectorValue(params.type)), + b.Branch(func->EndTarget())}); generator_.EmitFunction(func); - EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo" -%2 = OpTypeVoid -%3 = OpTypeFunction %2 -%6 = OpTypeInt 32 0 -%7 = OpConstant %6 1 -%8 = OpConstant %6 2 -%1 = OpFunction %2 None %3 -%4 = OpLabel -%5 = OpISub %6 %7 %8 -OpReturn -OpFunctionEnd -)"); -} - -TEST_F(SpvGeneratorImplTest, Binary_Sub_F32) { - auto* func = b.CreateFunction("foo", mod.Types().void_()); - func->StartTarget()->SetInstructions( - utils::Vector{b.Subtract(mod.Types().f32(), b.Constant(1_f), b.Constant(2_f)), - b.Branch(func->EndTarget())}); - - generator_.EmitFunction(func); - EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo" -%2 = OpTypeVoid -%3 = OpTypeFunction %2 -%6 = OpTypeFloat 32 -%7 = OpConstant %6 1 -%8 = OpConstant %6 2 -%1 = OpFunction %2 None %3 -%4 = OpLabel -%5 = OpFSub %6 %7 %8 -OpReturn -OpFunctionEnd -)"); -} - -TEST_F(SpvGeneratorImplTest, Binary_Sub_Vec2i) { - auto const_i32 = [&](int val) { return b.ir.constant_values.Get(i32(val)); }; - auto* func = b.CreateFunction("foo", mod.Types().void_()); - auto* lhs = b.ir.constant_values.Composite(mod.Types().vec2(mod.Types().i32()), - utils::Vector{const_i32(42), const_i32(-1)}); - auto* rhs = b.ir.constant_values.Composite(mod.Types().vec2(mod.Types().i32()), - utils::Vector{const_i32(0), const_i32(-43)}); - func->StartTarget()->SetInstructions( - utils::Vector{b.Subtract(mod.Types().Get(mod.Types().i32(), 2u), - b.Constant(lhs), b.Constant(rhs)), - b.Branch(func->EndTarget())}); - - generator_.EmitFunction(func); - EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo" -%2 = OpTypeVoid -%3 = OpTypeFunction %2 -%7 = OpTypeInt 32 1 -%6 = OpTypeVector %7 2 -%9 = OpConstant %7 42 -%10 = OpConstant %7 -1 -%8 = OpConstantComposite %6 %9 %10 -%12 = OpConstant %7 0 -%13 = OpConstant %7 -43 -%11 = OpConstantComposite %6 %12 %13 -%1 = OpFunction %2 None %3 -%4 = OpLabel -%5 = OpISub %6 %8 %11 -OpReturn -OpFunctionEnd -)"); -} - -TEST_F(SpvGeneratorImplTest, Binary_Sub_Vec4f) { - auto const_f32 = [&](float val) { return b.ir.constant_values.Get(f32(val)); }; - auto* func = b.CreateFunction("foo", mod.Types().void_()); - auto* lhs = b.ir.constant_values.Composite( - mod.Types().vec4(mod.Types().f32()), - utils::Vector{const_f32(42), const_f32(-1), const_f32(0), const_f32(1.25)}); - auto* rhs = b.ir.constant_values.Composite( - mod.Types().vec4(mod.Types().f32()), - utils::Vector{const_f32(0), const_f32(1.25), const_f32(-42), const_f32(1)}); - func->StartTarget()->SetInstructions( - utils::Vector{b.Subtract(mod.Types().Get(mod.Types().f32(), 4u), - b.Constant(lhs), b.Constant(rhs)), - b.Branch(func->EndTarget())}); - - generator_.EmitFunction(func); - EXPECT_EQ(DumpModule(generator_.Module()), R"(OpName %1 "foo" -%2 = OpTypeVoid -%3 = OpTypeFunction %2 -%7 = OpTypeFloat 32 -%6 = OpTypeVector %7 4 -%9 = OpConstant %7 42 -%10 = OpConstant %7 -1 -%11 = OpConstant %7 0 -%12 = OpConstant %7 1.25 -%8 = OpConstantComposite %6 %9 %10 %11 %12 -%14 = OpConstant %7 -42 -%15 = OpConstant %7 1 -%13 = OpConstantComposite %6 %11 %12 %14 %15 -%1 = OpFunction %2 None %3 -%4 = OpLabel -%5 = OpFSub %6 %8 %13 -OpReturn -OpFunctionEnd -)"); + EXPECT_THAT(DumpModule(generator_.Module()), ::testing::HasSubstr(params.spirv_inst)); } +INSTANTIATE_TEST_SUITE_P(SpvGeneratorImplTest_Binary_I32, + Arithmetic, + testing::Values(BinaryTestCase{kI32, ir::Binary::Kind::kAdd, "OpIAdd"}, + BinaryTestCase{kI32, ir::Binary::Kind::kSubtract, + "OpISub"})); +INSTANTIATE_TEST_SUITE_P(SpvGeneratorImplTest_Binary_U32, + Arithmetic, + testing::Values(BinaryTestCase{kU32, ir::Binary::Kind::kAdd, "OpIAdd"}, + BinaryTestCase{kU32, ir::Binary::Kind::kSubtract, + "OpISub"})); +INSTANTIATE_TEST_SUITE_P(SpvGeneratorImplTest_Binary_F32, + Arithmetic, + testing::Values(BinaryTestCase{kF32, ir::Binary::Kind::kAdd, "OpFAdd"}, + BinaryTestCase{kF32, ir::Binary::Kind::kSubtract, + "OpFSub"})); +INSTANTIATE_TEST_SUITE_P(SpvGeneratorImplTest_Binary_F16, + Arithmetic, + testing::Values(BinaryTestCase{kF16, ir::Binary::Kind::kAdd, "OpFAdd"}, + BinaryTestCase{kF16, ir::Binary::Kind::kSubtract, + "OpFSub"})); using Bitwise = BinaryInstructionTest; TEST_P(Bitwise, Scalar) {