@@ -40,7 +40,9 @@ class VFABIParserTest : public ::testing::Test {
4040 VFInfo Info;
4141 // / Reset the data needed for the test.
4242 void reset (const StringRef ScalarFTyStr) {
43- M = parseAssemblyString (" declare void @dummy()" , Err, Ctx);
43+ M = parseAssemblyString (" %dummy_named_struct = type { double, double }\n "
44+ " declare void @dummy()" ,
45+ Err, Ctx);
4446 EXPECT_NE (M.get (), nullptr )
4547 << " Loading an invalid module.\n " << Err.getMessage () << " \n " ;
4648 Type *Ty = parseType (ScalarFTyStr, Err, *(M));
@@ -753,6 +755,87 @@ TEST_F(VFABIParserTest, ParseVoidReturnTypeSVE) {
753755 EXPECT_EQ (VectorName, " vector_foo" );
754756}
755757
758+ TEST_F (VFABIParserTest, ParseWideStructReturnTypeSVE) {
759+ EXPECT_TRUE (
760+ invokeParser (" _ZGVsMxv_foo(vector_foo)" , " {double, double}(float)" ));
761+ EXPECT_EQ (ISA, VFISAKind::SVE);
762+ EXPECT_TRUE (isMasked ());
763+ ElementCount NXV2 = ElementCount::getScalable (2 );
764+ FunctionType *FTy = FunctionType::get (
765+ StructType::get (VectorType::get (Type::getDoubleTy (Ctx), NXV2),
766+ VectorType::get (Type::getDoubleTy (Ctx), NXV2)),
767+ {
768+ VectorType::get (Type::getFloatTy (Ctx), NXV2),
769+ VectorType::get (Type::getInt1Ty (Ctx), NXV2),
770+ },
771+ false );
772+ EXPECT_EQ (getFunctionType (), FTy);
773+ EXPECT_EQ (Parameters.size (), 2U );
774+ EXPECT_EQ (Parameters[0 ], VFParameter ({0 , VFParamKind::Vector}));
775+ EXPECT_EQ (Parameters[1 ], VFParameter ({1 , VFParamKind::GlobalPredicate}));
776+ EXPECT_EQ (VF, NXV2);
777+ EXPECT_EQ (ScalarName, " foo" );
778+ EXPECT_EQ (VectorName, " vector_foo" );
779+ }
780+
781+ TEST_F (VFABIParserTest, ParseWideStructMixedReturnTypeSVE) {
782+ EXPECT_TRUE (invokeParser (" _ZGVsMxv_foo(vector_foo)" , " {float, i64}(float)" ));
783+ EXPECT_EQ (ISA, VFISAKind::SVE);
784+ EXPECT_TRUE (isMasked ());
785+ ElementCount NXV2 = ElementCount::getScalable (2 );
786+ FunctionType *FTy = FunctionType::get (
787+ StructType::get (VectorType::get (Type::getFloatTy (Ctx), NXV2),
788+ VectorType::get (Type::getInt64Ty (Ctx), NXV2)),
789+ {
790+ VectorType::get (Type::getFloatTy (Ctx), NXV2),
791+ VectorType::get (Type::getInt1Ty (Ctx), NXV2),
792+ },
793+ false );
794+ EXPECT_EQ (getFunctionType (), FTy);
795+ EXPECT_EQ (Parameters.size (), 2U );
796+ EXPECT_EQ (Parameters[0 ], VFParameter ({0 , VFParamKind::Vector}));
797+ EXPECT_EQ (Parameters[1 ], VFParameter ({1 , VFParamKind::GlobalPredicate}));
798+ EXPECT_EQ (VF, NXV2);
799+ EXPECT_EQ (ScalarName, " foo" );
800+ EXPECT_EQ (VectorName, " vector_foo" );
801+ }
802+
803+ TEST_F (VFABIParserTest, ParseWideStructReturnTypeNEON) {
804+ EXPECT_TRUE (
805+ invokeParser (" _ZGVnN4v_foo(vector_foo)" , " {float, float}(float)" ));
806+ EXPECT_EQ (ISA, VFISAKind::AdvancedSIMD);
807+ EXPECT_FALSE (isMasked ());
808+ ElementCount V4 = ElementCount::getFixed (4 );
809+ FunctionType *FTy = FunctionType::get (
810+ StructType::get (VectorType::get (Type::getFloatTy (Ctx), V4),
811+ VectorType::get (Type::getFloatTy (Ctx), V4)),
812+ {
813+ VectorType::get (Type::getFloatTy (Ctx), V4),
814+ },
815+ false );
816+ EXPECT_EQ (getFunctionType (), FTy);
817+ EXPECT_EQ (Parameters.size (), 1U );
818+ EXPECT_EQ (Parameters[0 ], VFParameter ({0 , VFParamKind::Vector}));
819+ EXPECT_EQ (VF, V4);
820+ EXPECT_EQ (ScalarName, " foo" );
821+ EXPECT_EQ (VectorName, " vector_foo" );
822+ }
823+
824+ TEST_F (VFABIParserTest, ParseUnsupportedStructReturnTypesSVE) {
825+ // Struct with array element type.
826+ EXPECT_FALSE (
827+ invokeParser (" _ZGVsMxv_foo(vector_foo)" , " {double, [4 x float]}(float)" ));
828+ // Nested struct type.
829+ EXPECT_FALSE (
830+ invokeParser (" _ZGVsMxv_foo(vector_foo)" , " {{float, float}}(float)" ));
831+ // Packed struct type.
832+ EXPECT_FALSE (
833+ invokeParser (" _ZGVsMxv_foo(vector_foo)" , " <{double, float}>(float)" ));
834+ // Named struct type.
835+ EXPECT_FALSE (
836+ invokeParser (" _ZGVsMxv_foo(vector_foo)" , " %dummy_named_struct(float)" ));
837+ }
838+
756839// Make sure we reject unsupported parameter types.
757840TEST_F (VFABIParserTest, ParseUnsupportedElementTypeSVE) {
758841 EXPECT_FALSE (invokeParser (" _ZGVsMxv_foo(vector_foo)" , " void(i128)" ));
0 commit comments