@@ -815,7 +815,7 @@ TEST_P(MaybeSparseInstrProfTest, annotate_vp_data) {
815
815
ASSERT_EQ (1U , ValueData[3 ].Count );
816
816
}
817
817
818
- TEST_P (MaybeSparseInstrProfTest, get_icall_data_merge1 ) {
818
+ TEST_P (MaybeSparseInstrProfTest, icall_data_merge ) {
819
819
static const char caller[] = " caller" ;
820
820
NamedInstrProfRecord Record11 (caller, 0x1234 , {1 , 2 });
821
821
NamedInstrProfRecord Record12 (caller, 0x1234 , {1 , 2 });
@@ -920,8 +920,18 @@ TEST_P(MaybeSparseInstrProfTest, get_icall_data_merge1) {
920
920
ASSERT_EQ (2U , VD_4[2 ].Count );
921
921
}
922
922
923
- TEST_P (MaybeSparseInstrProfTest, get_icall_data_merge1_saturation) {
923
+ struct ValueProfileMergeEdgeCaseTest
924
+ : public InstrProfTest,
925
+ public ::testing::WithParamInterface<std::tuple<bool , uint32_t >> {
926
+ void SetUp () override { Writer.setOutputSparse (std::get<0 >(GetParam ())); }
927
+
928
+ uint32_t getValueProfileKind () const { return std::get<1 >(GetParam ()); }
929
+ };
930
+
931
+ TEST_P (ValueProfileMergeEdgeCaseTest, value_profile_data_merge_saturation) {
932
+ const uint32_t ValueKind = getValueProfileKind ();
924
933
static const char bar[] = " bar" ;
934
+ const uint64_t ProfiledValue = 0x5678 ;
925
935
926
936
const uint64_t MaxValCount = std::numeric_limits<uint64_t >::max ();
927
937
const uint64_t MaxEdgeCount = getInstrMaxCountValue ();
@@ -944,18 +954,18 @@ TEST_P(MaybeSparseInstrProfTest, get_icall_data_merge1_saturation) {
944
954
ASSERT_EQ (Result, instrprof_error::success);
945
955
946
956
NamedInstrProfRecord Record4 (" baz" , 0x5678 , {3 , 4 });
947
- Record4.reserveSites (IPVK_IndirectCallTarget , 1 );
948
- InstrProfValueData VD4[] = {{uint64_t (bar) , 1 }};
949
- Record4.addValueData (IPVK_IndirectCallTarget , 0 , VD4, 1 , nullptr );
957
+ Record4.reserveSites (ValueKind , 1 );
958
+ InstrProfValueData VD4[] = {{ProfiledValue , 1 }};
959
+ Record4.addValueData (ValueKind , 0 , VD4, 1 , nullptr );
950
960
Result = instrprof_error::success;
951
961
Writer.addRecord (std::move (Record4), Err);
952
962
ASSERT_EQ (Result, instrprof_error::success);
953
963
954
964
// Verify value data counter overflow.
955
965
NamedInstrProfRecord Record5 (" baz" , 0x5678 , {5 , 6 });
956
- Record5.reserveSites (IPVK_IndirectCallTarget , 1 );
957
- InstrProfValueData VD5[] = {{uint64_t (bar) , MaxValCount}};
958
- Record5.addValueData (IPVK_IndirectCallTarget , 0 , VD5, 1 , nullptr );
966
+ Record5.reserveSites (ValueKind , 1 );
967
+ InstrProfValueData VD5[] = {{ProfiledValue , MaxValCount}};
968
+ Record5.addValueData (ValueKind , 0 , VD5, 1 , nullptr );
959
969
Result = instrprof_error::success;
960
970
Writer.addRecord (std::move (Record5), Err);
961
971
ASSERT_EQ (Result, instrprof_error::counter_overflow);
@@ -966,48 +976,48 @@ TEST_P(MaybeSparseInstrProfTest, get_icall_data_merge1_saturation) {
966
976
// Verify saturation of counts.
967
977
Expected<InstrProfRecord> ReadRecord1 =
968
978
Reader->getInstrProfRecord (" foo" , 0x1234 );
969
- EXPECT_THAT_ERROR (ReadRecord1.takeError (), Succeeded ());
970
- ASSERT_EQ (MaxEdgeCount, ReadRecord1->Counts [0 ]);
979
+ ASSERT_THAT_ERROR (ReadRecord1.takeError (), Succeeded ());
980
+ EXPECT_EQ (MaxEdgeCount, ReadRecord1->Counts [0 ]);
971
981
972
982
Expected<InstrProfRecord> ReadRecord2 =
973
983
Reader->getInstrProfRecord (" baz" , 0x5678 );
974
984
ASSERT_TRUE (bool (ReadRecord2));
975
- ASSERT_EQ (1U , ReadRecord2->getNumValueSites (IPVK_IndirectCallTarget ));
985
+ ASSERT_EQ (1U , ReadRecord2->getNumValueSites (ValueKind ));
976
986
std::unique_ptr<InstrProfValueData[]> VD =
977
- ReadRecord2->getValueForSite (IPVK_IndirectCallTarget , 0 );
978
- ASSERT_EQ ( StringRef ( " bar " ), StringRef (( const char *) VD[0 ].Value , 3 ) );
979
- ASSERT_EQ (MaxValCount, VD[0 ].Count );
987
+ ReadRecord2->getValueForSite (ValueKind , 0 );
988
+ EXPECT_EQ (ProfiledValue, VD[0 ].Value );
989
+ EXPECT_EQ (MaxValCount, VD[0 ].Count );
980
990
}
981
991
982
- // This test tests that when there are too many values
983
- // for a given site, the merged results are properly
984
- // truncated.
985
- TEST_P (MaybeSparseInstrProfTest, get_icall_data_merge_site_trunc) {
992
+ // This test tests that when there are too many values for a given site, the
993
+ // merged results are properly truncated.
994
+ TEST_P (ValueProfileMergeEdgeCaseTest, value_profile_data_merge_site_trunc) {
995
+ const uint32_t ValueKind = getValueProfileKind ();
986
996
static const char caller[] = " caller" ;
987
997
988
998
NamedInstrProfRecord Record11 (caller, 0x1234 , {1 , 2 });
989
999
NamedInstrProfRecord Record12 (caller, 0x1234 , {1 , 2 });
990
1000
991
1001
// 2 value sites.
992
- Record11.reserveSites (IPVK_IndirectCallTarget , 2 );
1002
+ Record11.reserveSites (ValueKind , 2 );
993
1003
InstrProfValueData VD0[255 ];
994
1004
for (int I = 0 ; I < 255 ; I++) {
995
1005
VD0[I].Value = 2 * I;
996
1006
VD0[I].Count = 2 * I + 1000 ;
997
1007
}
998
1008
999
- Record11.addValueData (IPVK_IndirectCallTarget , 0 , VD0, 255 , nullptr );
1000
- Record11.addValueData (IPVK_IndirectCallTarget , 1 , nullptr , 0 , nullptr );
1009
+ Record11.addValueData (ValueKind , 0 , VD0, 255 , nullptr );
1010
+ Record11.addValueData (ValueKind , 1 , nullptr , 0 , nullptr );
1001
1011
1002
- Record12.reserveSites (IPVK_IndirectCallTarget , 2 );
1012
+ Record12.reserveSites (ValueKind , 2 );
1003
1013
InstrProfValueData VD1[255 ];
1004
1014
for (int I = 0 ; I < 255 ; I++) {
1005
1015
VD1[I].Value = 2 * I + 1 ;
1006
1016
VD1[I].Count = 2 * I + 1001 ;
1007
1017
}
1008
1018
1009
- Record12.addValueData (IPVK_IndirectCallTarget , 0 , VD1, 255 , nullptr );
1010
- Record12.addValueData (IPVK_IndirectCallTarget , 1 , nullptr , 0 , nullptr );
1019
+ Record12.addValueData (ValueKind , 0 , VD1, 255 , nullptr );
1020
+ Record12.addValueData (ValueKind , 1 , nullptr , 0 , nullptr );
1011
1021
1012
1022
Writer.addRecord (std::move (Record11), Err);
1013
1023
// Merge profile data.
@@ -1017,17 +1027,23 @@ TEST_P(MaybeSparseInstrProfTest, get_icall_data_merge_site_trunc) {
1017
1027
readProfile (std::move (Profile));
1018
1028
1019
1029
Expected<InstrProfRecord> R = Reader->getInstrProfRecord (" caller" , 0x1234 );
1020
- EXPECT_THAT_ERROR (R.takeError (), Succeeded ());
1021
- std::unique_ptr<InstrProfValueData[]> VD (
1022
- R->getValueForSite (IPVK_IndirectCallTarget, 0 ));
1023
- ASSERT_EQ (2U , R->getNumValueSites (IPVK_IndirectCallTarget));
1024
- ASSERT_EQ (255U , R->getNumValueDataForSite (IPVK_IndirectCallTarget, 0 ));
1030
+ ASSERT_THAT_ERROR (R.takeError (), Succeeded ());
1031
+ std::unique_ptr<InstrProfValueData[]> VD (R->getValueForSite (ValueKind, 0 ));
1032
+ ASSERT_EQ (2U , R->getNumValueSites (ValueKind));
1033
+ EXPECT_EQ (255U , R->getNumValueDataForSite (ValueKind, 0 ));
1025
1034
for (unsigned I = 0 ; I < 255 ; I++) {
1026
- ASSERT_EQ (VD[I].Value , 509 - I);
1027
- ASSERT_EQ (VD[I].Count , 1509 - I);
1035
+ EXPECT_EQ (VD[I].Value , 509 - I);
1036
+ EXPECT_EQ (VD[I].Count , 1509 - I);
1028
1037
}
1029
1038
}
1030
1039
1040
+ INSTANTIATE_TEST_SUITE_P (
1041
+ EdgeCaseTest, ValueProfileMergeEdgeCaseTest,
1042
+ ::testing::Combine (::testing::Bool(), /* Sparse */
1043
+ ::testing::Values(IPVK_IndirectCallTarget,
1044
+ IPVK_MemOPSize) /* ValueKind */
1045
+ ));
1046
+
1031
1047
static void addValueProfData (InstrProfRecord &Record) {
1032
1048
Record.reserveSites (IPVK_IndirectCallTarget, 5 );
1033
1049
InstrProfValueData VD0[] = {{uint64_t (callee1), 400 },
0 commit comments