[spirv-reader] Add OpCopyObject

Bug: tint:3
Change-Id: Ie389c825ddcc8ea6f110997e9b8f39ebbb1e1e0d
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/23340
Reviewed-by: dan sinclair <dsinclair@google.com>
This commit is contained in:
David Neto 2020-06-17 17:46:23 +00:00 committed by dan sinclair
parent 05e73db4ef
commit 1650af2c86
2 changed files with 81 additions and 0 deletions

View File

@ -2423,6 +2423,12 @@ bool FunctionEmitter::EmitStatement(const spvtools::opt::Instruction& inst) {
// So represent a load by a new const definition.
return EmitConstDefinition(
inst, MakeExpression(inst.GetSingleWordInOperand(0)));
case SpvOpCopyObject:
// Arguably, OpCopyObject is purely combinatorial. On the other hand,
// it exists to make a new name for something. So we choose to make
// a new named constant definition.
return EmitConstDefinition(
inst, MakeExpression(inst.GetSingleWordInOperand(0)));
case SpvOpFunctionCall:
// TODO(dneto): Fill this out. Make this pass, for existing tests
return success();

View File

@ -509,6 +509,81 @@ TEST_F(SpvParserTest_CompositeExtract, Struct_Array_Matrix_Vector) {
<< ToString(fe.ast_body());
}
using SpvParserTest_CopyObject = SpvParserTest;
TEST_F(SpvParserTest_CopyObject, Scalar) {
const auto assembly = Preamble() + R"(
%100 = OpFunction %void None %voidfn
%entry = OpLabel
%1 = OpCopyObject %uint %uint_3
%2 = OpCopyObject %uint %1
OpReturn
OpFunctionEnd
)";
auto* p = parser(test::Assemble(assembly));
ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
FunctionEmitter fe(p, *spirv_function(100));
EXPECT_TRUE(fe.EmitBody()) << p->error();
EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
Variable{
x_1
none
__u32
{
ScalarConstructor{3}
}
}
}
VariableDeclStatement{
Variable{
x_2
none
__u32
{
Identifier{x_1}
}
}
})")) << ToString(fe.ast_body());
}
TEST_F(SpvParserTest_CopyObject, Pointer) {
const auto assembly = Preamble() + R"(
%ptr = OpTypePointer Function %uint
%10 = OpVariable %ptr Function
%100 = OpFunction %void None %voidfn
%entry = OpLabel
%1 = OpCopyObject %ptr %10
%2 = OpCopyObject %ptr %1
OpReturn
OpFunctionEnd
)";
auto* p = parser(test::Assemble(assembly));
ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
FunctionEmitter fe(p, *spirv_function(100));
EXPECT_TRUE(fe.EmitBody()) << p->error();
EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
Variable{
x_1
none
__ptr_function__u32
{
Identifier{x_10}
}
}
}
VariableDeclStatement{
Variable{
x_2
none
__ptr_function__u32
{
Identifier{x_1}
}
}
})")) << ToString(fe.ast_body());
}
} // namespace
} // namespace spirv
} // namespace reader