Skip to content

Commit 9ad102f

Browse files
[ProfileData] Migrate to getValueArrayForSite (#95493)
This patch migrates uses of getValueForSite to getValueArrayForSite. Each hunk is self-contained, meaning that each one can be applied independently of the others. In the unit test, there are cases where the array length check is performed a lot earlier than the array content check. For now, I'm leaving the length checks where they are. I'll consider moving them when I migrate uses of getNumValueDataForSite to getValueArrayForSite in a follow-up patch.
1 parent 7e3e9d4 commit 9ad102f

File tree

3 files changed

+57
-55
lines changed

3 files changed

+57
-55
lines changed

llvm/lib/ProfileData/InstrProf.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -731,10 +731,8 @@ void InstrProfRecord::accumulateCounts(CountSumOrPercent &Sum) const {
731731
uint64_t KindSum = 0;
732732
uint32_t NumValueSites = getNumValueSites(VK);
733733
for (size_t I = 0; I < NumValueSites; ++I) {
734-
uint32_t NV = getNumValueDataForSite(VK, I);
735-
std::unique_ptr<InstrProfValueData[]> VD = getValueForSite(VK, I);
736-
for (uint32_t V = 0; V < NV; V++)
737-
KindSum += VD[V].Count;
734+
for (const auto &V : getValueArrayForSite(VK, I))
735+
KindSum += V.Count;
738736
}
739737
Sum.ValueCounts[VK] += KindSum;
740738
}
@@ -1089,13 +1087,14 @@ uint32_t getNumValueDataInstrProf(const void *Record, uint32_t VKind) {
10891087

10901088
uint32_t getNumValueDataForSiteInstrProf(const void *R, uint32_t VK,
10911089
uint32_t S) {
1092-
return reinterpret_cast<const InstrProfRecord *>(R)
1093-
->getNumValueDataForSite(VK, S);
1090+
const auto *IPR = reinterpret_cast<const InstrProfRecord *>(R);
1091+
return IPR->getValueArrayForSite(VK, S).size();
10941092
}
10951093

10961094
void getValueForSiteInstrProf(const void *R, InstrProfValueData *Dst,
10971095
uint32_t K, uint32_t S) {
1098-
reinterpret_cast<const InstrProfRecord *>(R)->getValueForSite(Dst, K, S);
1096+
const auto *IPR = reinterpret_cast<const InstrProfRecord *>(R);
1097+
llvm::copy(IPR->getValueArrayForSite(K, S), Dst);
10991098
}
11001099

11011100
ValueProfData *allocValueProfDataInstrProf(size_t TotalSizeInBytes) {
@@ -1274,14 +1273,9 @@ void annotateValueSite(Module &M, Instruction &Inst,
12741273
const InstrProfRecord &InstrProfR,
12751274
InstrProfValueKind ValueKind, uint32_t SiteIdx,
12761275
uint32_t MaxMDCount) {
1277-
uint32_t NV = InstrProfR.getNumValueDataForSite(ValueKind, SiteIdx);
1278-
if (!NV)
1276+
auto VDs = InstrProfR.getValueArrayForSite(ValueKind, SiteIdx);
1277+
if (VDs.empty())
12791278
return;
1280-
1281-
std::unique_ptr<InstrProfValueData[]> VD =
1282-
InstrProfR.getValueForSite(ValueKind, SiteIdx);
1283-
1284-
ArrayRef<InstrProfValueData> VDs(VD.get(), NV);
12851279
uint64_t Sum = 0;
12861280
for (const InstrProfValueData &V : VDs)
12871281
Sum = SaturatingAdd(Sum, V.Count);

llvm/lib/ProfileData/InstrProfWriter.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,15 +1088,14 @@ void InstrProfWriter::writeRecordInText(StringRef Name, uint64_t Hash,
10881088
OS << "# ValueKind = " << ValueProfKindStr[VK] << ":\n" << VK << "\n";
10891089
OS << "# NumValueSites:\n" << NS << "\n";
10901090
for (uint32_t S = 0; S < NS; S++) {
1091-
uint32_t ND = Func.getNumValueDataForSite(VK, S);
1092-
OS << ND << "\n";
1093-
std::unique_ptr<InstrProfValueData[]> VD = Func.getValueForSite(VK, S);
1094-
for (uint32_t I = 0; I < ND; I++) {
1091+
auto VD = Func.getValueArrayForSite(VK, S);
1092+
OS << VD.size() << "\n";
1093+
for (const auto &V : VD) {
10951094
if (VK == IPVK_IndirectCallTarget || VK == IPVK_VTableTarget)
1096-
OS << Symtab.getFuncOrVarNameIfDefined(VD[I].Value) << ":"
1097-
<< VD[I].Count << "\n";
1095+
OS << Symtab.getFuncOrVarNameIfDefined(V.Value) << ":" << V.Count
1096+
<< "\n";
10981097
else
1099-
OS << VD[I].Value << ":" << VD[I].Count << "\n";
1098+
OS << V.Value << ":" << V.Count << "\n";
11001099
}
11011100
}
11021101
}

llvm/unittests/ProfileData/InstrProfTest.cpp

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,9 +1392,9 @@ TEST(ValueProfileReadWriteTest, value_prof_data_read_write) {
13921392
return VD1.Count > VD2.Count;
13931393
};
13941394

1395-
std::unique_ptr<InstrProfValueData[]> VD_0(
1396-
Record.getValueForSite(IPVK_IndirectCallTarget, 0));
1397-
llvm::sort(&VD_0[0], &VD_0[5], Cmp);
1395+
SmallVector<InstrProfValueData> VD_0(
1396+
Record.getValueArrayForSite(IPVK_IndirectCallTarget, 0));
1397+
llvm::sort(VD_0, Cmp);
13981398
EXPECT_STREQ((const char *)VD_0[0].Value, "callee2");
13991399
EXPECT_EQ(1000U, VD_0[0].Count);
14001400
EXPECT_STREQ((const char *)VD_0[1].Value, "callee3");
@@ -1406,9 +1406,9 @@ TEST(ValueProfileReadWriteTest, value_prof_data_read_write) {
14061406
EXPECT_STREQ((const char *)VD_0[4].Value, "callee5");
14071407
EXPECT_EQ(100U, VD_0[4].Count);
14081408

1409-
std::unique_ptr<InstrProfValueData[]> VD_1(
1410-
Record.getValueForSite(IPVK_IndirectCallTarget, 1));
1411-
llvm::sort(&VD_1[0], &VD_1[4], Cmp);
1409+
SmallVector<InstrProfValueData> VD_1(
1410+
Record.getValueArrayForSite(IPVK_IndirectCallTarget, 1));
1411+
llvm::sort(VD_1, Cmp);
14121412
EXPECT_STREQ((const char *)VD_1[0].Value, "callee2");
14131413
EXPECT_EQ(VD_1[0].Count, 2500U);
14141414
EXPECT_STREQ((const char *)VD_1[1].Value, "callee1");
@@ -1418,19 +1418,19 @@ TEST(ValueProfileReadWriteTest, value_prof_data_read_write) {
14181418
EXPECT_STREQ((const char *)VD_1[3].Value, "callee5");
14191419
EXPECT_EQ(VD_1[3].Count, 800U);
14201420

1421-
std::unique_ptr<InstrProfValueData[]> VD_2(
1422-
Record.getValueForSite(IPVK_IndirectCallTarget, 2));
1423-
llvm::sort(&VD_2[0], &VD_2[3], Cmp);
1421+
SmallVector<InstrProfValueData> VD_2(
1422+
Record.getValueArrayForSite(IPVK_IndirectCallTarget, 2));
1423+
llvm::sort(VD_2, Cmp);
14241424
EXPECT_STREQ((const char *)VD_2[0].Value, "callee4");
14251425
EXPECT_EQ(VD_2[0].Count, 5500U);
14261426
EXPECT_STREQ((const char *)VD_2[1].Value, "callee3");
14271427
EXPECT_EQ(VD_2[1].Count, 1000U);
14281428
EXPECT_STREQ((const char *)VD_2[2].Value, "callee6");
14291429
EXPECT_EQ(VD_2[2].Count, 800U);
14301430

1431-
std::unique_ptr<InstrProfValueData[]> VD_3(
1432-
Record.getValueForSite(IPVK_IndirectCallTarget, 3));
1433-
llvm::sort(&VD_3[0], &VD_3[2], Cmp);
1431+
SmallVector<InstrProfValueData> VD_3(
1432+
Record.getValueArrayForSite(IPVK_IndirectCallTarget, 3));
1433+
llvm::sort(VD_3, Cmp);
14341434
EXPECT_STREQ((const char *)VD_3[0].Value, "callee3");
14351435
EXPECT_EQ(VD_3[0].Count, 2000U);
14361436
EXPECT_STREQ((const char *)VD_3[1].Value, "callee2");
@@ -1442,8 +1442,9 @@ TEST(ValueProfileReadWriteTest, value_prof_data_read_write) {
14421442
ASSERT_EQ(Record.getNumValueDataForSite(IPVK_VTableTarget, 2), 3U);
14431443
ASSERT_EQ(Record.getNumValueDataForSite(IPVK_VTableTarget, 3), 2U);
14441444

1445-
auto VD0(Record.getValueForSite(IPVK_VTableTarget, 0));
1446-
llvm::sort(&VD0[0], &VD0[5], Cmp);
1445+
SmallVector<InstrProfValueData> VD0(
1446+
Record.getValueArrayForSite(IPVK_VTableTarget, 0));
1447+
llvm::sort(VD0, Cmp);
14471448
EXPECT_EQ(VD0[0].Value, getCalleeAddress(vtable2));
14481449
EXPECT_EQ(VD0[0].Count, 1000U);
14491450
EXPECT_EQ(VD0[1].Value, getCalleeAddress(vtable3));
@@ -1455,8 +1456,9 @@ TEST(ValueProfileReadWriteTest, value_prof_data_read_write) {
14551456
EXPECT_EQ(VD0[4].Value, getCalleeAddress(vtable5));
14561457
EXPECT_EQ(VD0[4].Count, 100U);
14571458

1458-
auto VD1(Record.getValueForSite(IPVK_VTableTarget, 1));
1459-
llvm::sort(&VD1[0], &VD1[4], Cmp);
1459+
SmallVector<InstrProfValueData> VD1(
1460+
Record.getValueArrayForSite(IPVK_VTableTarget, 1));
1461+
llvm::sort(VD1, Cmp);
14601462
EXPECT_EQ(VD1[0].Value, getCalleeAddress(vtable2));
14611463
EXPECT_EQ(VD1[0].Count, 2500U);
14621464
EXPECT_EQ(VD1[1].Value, getCalleeAddress(vtable1));
@@ -1466,17 +1468,19 @@ TEST(ValueProfileReadWriteTest, value_prof_data_read_write) {
14661468
EXPECT_EQ(VD1[3].Value, getCalleeAddress(vtable5));
14671469
EXPECT_EQ(VD1[3].Count, 800U);
14681470

1469-
auto VD2(Record.getValueForSite(IPVK_VTableTarget, 2));
1470-
llvm::sort(&VD2[0], &VD2[3], Cmp);
1471+
SmallVector<InstrProfValueData> VD2(
1472+
Record.getValueArrayForSite(IPVK_VTableTarget, 2));
1473+
llvm::sort(VD2, Cmp);
14711474
EXPECT_EQ(VD2[0].Value, getCalleeAddress(vtable4));
14721475
EXPECT_EQ(VD2[0].Count, 5500U);
14731476
EXPECT_EQ(VD2[1].Value, getCalleeAddress(vtable3));
14741477
EXPECT_EQ(VD2[1].Count, 1000U);
14751478
EXPECT_EQ(VD2[2].Value, getCalleeAddress(vtable6));
14761479
EXPECT_EQ(VD2[2].Count, 800U);
14771480

1478-
auto VD3(Record.getValueForSite(IPVK_VTableTarget, 3));
1479-
llvm::sort(&VD3[0], &VD3[2], Cmp);
1481+
SmallVector<InstrProfValueData> VD3(
1482+
Record.getValueArrayForSite(IPVK_VTableTarget, 3));
1483+
llvm::sort(VD3, Cmp);
14801484
EXPECT_EQ(VD3[0].Value, getCalleeAddress(vtable3));
14811485
EXPECT_EQ(VD3[0].Count, 2000U);
14821486
EXPECT_EQ(VD3[1].Value, getCalleeAddress(vtable2));
@@ -1537,8 +1541,9 @@ TEST(ValueProfileReadWriteTest, symtab_mapping) {
15371541
auto Cmp = [](const InstrProfValueData &VD1, const InstrProfValueData &VD2) {
15381542
return VD1.Count > VD2.Count;
15391543
};
1540-
auto VD_0(Record.getValueForSite(IPVK_IndirectCallTarget, 0));
1541-
llvm::sort(&VD_0[0], &VD_0[5], Cmp);
1544+
SmallVector<InstrProfValueData> VD_0(
1545+
Record.getValueArrayForSite(IPVK_IndirectCallTarget, 0));
1546+
llvm::sort(VD_0, Cmp);
15421547
ASSERT_EQ(VD_0[0].Value, 0x2000ULL);
15431548
ASSERT_EQ(VD_0[0].Count, 1000U);
15441549
ASSERT_EQ(VD_0[1].Value, 0x3000ULL);
@@ -1554,9 +1559,10 @@ TEST(ValueProfileReadWriteTest, symtab_mapping) {
15541559

15551560
{
15561561
// The first vtable site.
1557-
auto VD(Record.getValueForSite(IPVK_VTableTarget, 0));
1558-
ASSERT_EQ(Record.getNumValueDataForSite(IPVK_VTableTarget, 0), 5U);
1559-
llvm::sort(&VD[0], &VD[5], Cmp);
1562+
SmallVector<InstrProfValueData> VD(
1563+
Record.getValueArrayForSite(IPVK_VTableTarget, 0));
1564+
ASSERT_THAT(VD, SizeIs(5));
1565+
llvm::sort(VD, Cmp);
15601566
EXPECT_EQ(VD[0].Count, 1000U);
15611567
EXPECT_EQ(VD[0].Value, MD5Hash("vtable2"));
15621568
EXPECT_EQ(VD[1].Count, 500U);
@@ -1573,9 +1579,10 @@ TEST(ValueProfileReadWriteTest, symtab_mapping) {
15731579

15741580
{
15751581
// The second vtable site.
1576-
auto VD(Record.getValueForSite(IPVK_VTableTarget, 1));
1577-
ASSERT_EQ(Record.getNumValueDataForSite(IPVK_VTableTarget, 1), 4U);
1578-
llvm::sort(&VD[0], &VD[4], Cmp);
1582+
SmallVector<InstrProfValueData> VD(
1583+
Record.getValueArrayForSite(IPVK_VTableTarget, 1));
1584+
ASSERT_THAT(VD, SizeIs(4));
1585+
llvm::sort(VD, Cmp);
15791586
EXPECT_EQ(VD[0].Value, MD5Hash("vtable2"));
15801587
EXPECT_EQ(VD[0].Count, 2500U);
15811588
EXPECT_EQ(VD[1].Value, MD5Hash("vtable1"));
@@ -1590,9 +1597,10 @@ TEST(ValueProfileReadWriteTest, symtab_mapping) {
15901597

15911598
{
15921599
// The third vtable site.
1593-
auto VD(Record.getValueForSite(IPVK_VTableTarget, 2));
1594-
ASSERT_EQ(Record.getNumValueDataForSite(IPVK_VTableTarget, 2), 3U);
1595-
llvm::sort(&VD[0], &VD[3], Cmp);
1600+
SmallVector<InstrProfValueData> VD(
1601+
Record.getValueArrayForSite(IPVK_VTableTarget, 2));
1602+
ASSERT_THAT(VD, SizeIs(3));
1603+
llvm::sort(VD, Cmp);
15961604
EXPECT_EQ(VD[0].Count, 5500U);
15971605
EXPECT_EQ(VD[0].Value, MD5Hash("vtable4"));
15981606
EXPECT_EQ(VD[1].Count, 1000U);
@@ -1604,9 +1612,10 @@ TEST(ValueProfileReadWriteTest, symtab_mapping) {
16041612

16051613
{
16061614
// The fourth vtable site.
1607-
auto VD(Record.getValueForSite(IPVK_VTableTarget, 3));
1608-
ASSERT_EQ(Record.getNumValueDataForSite(IPVK_VTableTarget, 3), 2U);
1609-
llvm::sort(&VD[0], &VD[2], Cmp);
1615+
SmallVector<InstrProfValueData> VD(
1616+
Record.getValueArrayForSite(IPVK_VTableTarget, 3));
1617+
ASSERT_THAT(VD, SizeIs(2));
1618+
llvm::sort(VD, Cmp);
16101619
EXPECT_EQ(VD[0].Count, 2000U);
16111620
EXPECT_EQ(VD[0].Value, MD5Hash("vtable3"));
16121621
EXPECT_EQ(VD[1].Count, 1800U);

0 commit comments

Comments
 (0)