@@ -40,7 +40,9 @@ class VFABIParserTest : public ::testing::Test {
40
40
VFInfo Info;
41
41
// / Reset the data needed for the test.
42
42
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);
44
46
EXPECT_NE (M.get (), nullptr )
45
47
<< " Loading an invalid module.\n " << Err.getMessage () << " \n " ;
46
48
Type *Ty = parseType (ScalarFTyStr, Err, *(M));
@@ -753,6 +755,87 @@ TEST_F(VFABIParserTest, ParseVoidReturnTypeSVE) {
753
755
EXPECT_EQ (VectorName, " vector_foo" );
754
756
}
755
757
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
+
756
839
// Make sure we reject unsupported parameter types.
757
840
TEST_F (VFABIParserTest, ParseUnsupportedElementTypeSVE) {
758
841
EXPECT_FALSE (invokeParser (" _ZGVsMxv_foo(vector_foo)" , " void(i128)" ));
0 commit comments