Re-apply r302108, "IR: Use pointers instead of GUIDs to represent edges in the module summary. NFCI."
with a fix for the clang backend. llvm-svn: 302176
This commit is contained in:
@@ -694,15 +694,16 @@ class ModuleSummaryIndexBitcodeReader : public BitcodeReaderBase {
|
||||
/// Used to enable on-demand parsing of the VST.
|
||||
uint64_t VSTOffset = 0;
|
||||
|
||||
// Map to save ValueId to GUID association that was recorded in the
|
||||
// Map to save ValueId to ValueInfo association that was recorded in the
|
||||
// ValueSymbolTable. It is used after the VST is parsed to convert
|
||||
// call graph edges read from the function summary from referencing
|
||||
// callees by their ValueId to using the GUID instead, which is how
|
||||
// callees by their ValueId to using the ValueInfo instead, which is how
|
||||
// they are recorded in the summary index being built.
|
||||
// We save a second GUID which is the same as the first one, but ignoring the
|
||||
// linkage, i.e. for value other than local linkage they are identical.
|
||||
DenseMap<unsigned, std::pair<GlobalValue::GUID, GlobalValue::GUID>>
|
||||
ValueIdToCallGraphGUIDMap;
|
||||
// We save a GUID which refers to the same global as the ValueInfo, but
|
||||
// ignoring the linkage, i.e. for values other than local linkage they are
|
||||
// identical.
|
||||
DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
|
||||
ValueIdToValueInfoMap;
|
||||
|
||||
/// Map populated during module path string table parsing, from the
|
||||
/// module ID to a string reference owned by the index's module
|
||||
@@ -742,8 +743,8 @@ private:
|
||||
Error parseEntireSummary();
|
||||
Error parseModuleStringTable();
|
||||
|
||||
std::pair<GlobalValue::GUID, GlobalValue::GUID>
|
||||
getGUIDFromValueId(unsigned ValueId);
|
||||
std::pair<ValueInfo, GlobalValue::GUID>
|
||||
getValueInfoFromValueId(unsigned ValueId);
|
||||
|
||||
ModulePathStringTableTy::iterator addThisModulePath();
|
||||
};
|
||||
@@ -4697,11 +4698,11 @@ ModuleSummaryIndexBitcodeReader::addThisModulePath() {
|
||||
return TheIndex.addModulePath(ModulePath, ModuleId);
|
||||
}
|
||||
|
||||
std::pair<GlobalValue::GUID, GlobalValue::GUID>
|
||||
ModuleSummaryIndexBitcodeReader::getGUIDFromValueId(unsigned ValueId) {
|
||||
auto VGI = ValueIdToCallGraphGUIDMap.find(ValueId);
|
||||
assert(VGI != ValueIdToCallGraphGUIDMap.end());
|
||||
return VGI->second;
|
||||
std::pair<ValueInfo, GlobalValue::GUID>
|
||||
ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(unsigned ValueId) {
|
||||
auto VGI = ValueIdToValueInfoMap[ValueId];
|
||||
assert(VGI.first);
|
||||
return VGI;
|
||||
}
|
||||
|
||||
void ModuleSummaryIndexBitcodeReader::setValueGUID(
|
||||
@@ -4716,8 +4717,8 @@ void ModuleSummaryIndexBitcodeReader::setValueGUID(
|
||||
if (PrintSummaryGUIDs)
|
||||
dbgs() << "GUID " << ValueGUID << "(" << OriginalNameID << ") is "
|
||||
<< ValueName << "\n";
|
||||
ValueIdToCallGraphGUIDMap[ValueID] =
|
||||
std::make_pair(ValueGUID, OriginalNameID);
|
||||
ValueIdToValueInfoMap[ValueID] =
|
||||
std::make_pair(TheIndex.getOrInsertValueInfo(ValueGUID), OriginalNameID);
|
||||
}
|
||||
|
||||
// Specialized value symbol table parser used when reading module index
|
||||
@@ -4795,7 +4796,8 @@ Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
|
||||
GlobalValue::GUID RefGUID = Record[1];
|
||||
// The "original name", which is the second value of the pair will be
|
||||
// overriden later by a FS_COMBINED_ORIGINAL_NAME in the combined index.
|
||||
ValueIdToCallGraphGUIDMap[ValueID] = std::make_pair(RefGUID, RefGUID);
|
||||
ValueIdToValueInfoMap[ValueID] =
|
||||
std::make_pair(TheIndex.getOrInsertValueInfo(RefGUID), RefGUID);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -4940,7 +4942,7 @@ ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
|
||||
std::vector<ValueInfo> Ret;
|
||||
Ret.reserve(Record.size());
|
||||
for (uint64_t RefValueId : Record)
|
||||
Ret.push_back(getGUIDFromValueId(RefValueId).first);
|
||||
Ret.push_back(getValueInfoFromValueId(RefValueId).first);
|
||||
return Ret;
|
||||
}
|
||||
|
||||
@@ -4950,14 +4952,14 @@ std::vector<FunctionSummary::EdgeTy> ModuleSummaryIndexBitcodeReader::makeCallLi
|
||||
Ret.reserve(Record.size());
|
||||
for (unsigned I = 0, E = Record.size(); I != E; ++I) {
|
||||
CalleeInfo::HotnessType Hotness = CalleeInfo::HotnessType::Unknown;
|
||||
GlobalValue::GUID CalleeGUID = getGUIDFromValueId(Record[I]).first;
|
||||
ValueInfo Callee = getValueInfoFromValueId(Record[I]).first;
|
||||
if (IsOldProfileFormat) {
|
||||
I += 1; // Skip old callsitecount field
|
||||
if (HasProfile)
|
||||
I += 1; // Skip old profilecount field
|
||||
} else if (HasProfile)
|
||||
Hotness = static_cast<CalleeInfo::HotnessType>(Record[++I]);
|
||||
Ret.push_back(FunctionSummary::EdgeTy{CalleeGUID, CalleeInfo{Hotness}});
|
||||
Ret.push_back(FunctionSummary::EdgeTy{Callee, CalleeInfo{Hotness}});
|
||||
}
|
||||
return Ret;
|
||||
}
|
||||
@@ -5027,7 +5029,8 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
|
||||
case bitc::FS_VALUE_GUID: { // [valueid, refguid]
|
||||
uint64_t ValueID = Record[0];
|
||||
GlobalValue::GUID RefGUID = Record[1];
|
||||
ValueIdToCallGraphGUIDMap[ValueID] = std::make_pair(RefGUID, RefGUID);
|
||||
ValueIdToValueInfoMap[ValueID] =
|
||||
std::make_pair(TheIndex.getOrInsertValueInfo(RefGUID), RefGUID);
|
||||
break;
|
||||
}
|
||||
// FS_PERMODULE: [valueid, flags, instcount, numrefs, numrefs x valueid,
|
||||
@@ -5068,10 +5071,10 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
|
||||
PendingTypeCheckedLoadVCalls.clear();
|
||||
PendingTypeTestAssumeConstVCalls.clear();
|
||||
PendingTypeCheckedLoadConstVCalls.clear();
|
||||
auto GUID = getGUIDFromValueId(ValueID);
|
||||
auto VIAndOriginalGUID = getValueInfoFromValueId(ValueID);
|
||||
FS->setModulePath(addThisModulePath()->first());
|
||||
FS->setOriginalName(GUID.second);
|
||||
TheIndex.addGlobalValueSummary(GUID.first, std::move(FS));
|
||||
FS->setOriginalName(VIAndOriginalGUID.second);
|
||||
TheIndex.addGlobalValueSummary(VIAndOriginalGUID.first, std::move(FS));
|
||||
break;
|
||||
}
|
||||
// FS_ALIAS: [valueid, flags, valueid]
|
||||
@@ -5091,14 +5094,15 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
|
||||
// ownership.
|
||||
AS->setModulePath(addThisModulePath()->first());
|
||||
|
||||
GlobalValue::GUID AliaseeGUID = getGUIDFromValueId(AliaseeID).first;
|
||||
GlobalValue::GUID AliaseeGUID =
|
||||
getValueInfoFromValueId(AliaseeID).first.getGUID();
|
||||
auto AliaseeInModule =
|
||||
TheIndex.findSummaryInModule(AliaseeGUID, ModulePath);
|
||||
if (!AliaseeInModule)
|
||||
return error("Alias expects aliasee summary to be parsed");
|
||||
AS->setAliasee(AliaseeInModule);
|
||||
|
||||
auto GUID = getGUIDFromValueId(ValueID);
|
||||
auto GUID = getValueInfoFromValueId(ValueID);
|
||||
AS->setOriginalName(GUID.second);
|
||||
TheIndex.addGlobalValueSummary(GUID.first, std::move(AS));
|
||||
break;
|
||||
@@ -5112,7 +5116,7 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
|
||||
makeRefList(ArrayRef<uint64_t>(Record).slice(2));
|
||||
auto FS = llvm::make_unique<GlobalVarSummary>(Flags, std::move(Refs));
|
||||
FS->setModulePath(addThisModulePath()->first());
|
||||
auto GUID = getGUIDFromValueId(ValueID);
|
||||
auto GUID = getValueInfoFromValueId(ValueID);
|
||||
FS->setOriginalName(GUID.second);
|
||||
TheIndex.addGlobalValueSummary(GUID.first, std::move(FS));
|
||||
break;
|
||||
@@ -5139,7 +5143,7 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
|
||||
std::vector<FunctionSummary::EdgeTy> Edges = makeCallList(
|
||||
ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
|
||||
IsOldProfileFormat, HasProfile);
|
||||
GlobalValue::GUID GUID = getGUIDFromValueId(ValueID).first;
|
||||
ValueInfo VI = getValueInfoFromValueId(ValueID).first;
|
||||
auto FS = llvm::make_unique<FunctionSummary>(
|
||||
Flags, InstCount, std::move(Refs), std::move(Edges),
|
||||
std::move(PendingTypeTests), std::move(PendingTypeTestAssumeVCalls),
|
||||
@@ -5152,9 +5156,9 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
|
||||
PendingTypeTestAssumeConstVCalls.clear();
|
||||
PendingTypeCheckedLoadConstVCalls.clear();
|
||||
LastSeenSummary = FS.get();
|
||||
LastSeenGUID = GUID;
|
||||
LastSeenGUID = VI.getGUID();
|
||||
FS->setModulePath(ModuleIdMap[ModuleId]);
|
||||
TheIndex.addGlobalValueSummary(GUID, std::move(FS));
|
||||
TheIndex.addGlobalValueSummary(VI, std::move(FS));
|
||||
break;
|
||||
}
|
||||
// FS_COMBINED_ALIAS: [valueid, modid, flags, valueid]
|
||||
@@ -5170,16 +5174,17 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
|
||||
LastSeenSummary = AS.get();
|
||||
AS->setModulePath(ModuleIdMap[ModuleId]);
|
||||
|
||||
auto AliaseeGUID = getGUIDFromValueId(AliaseeValueId).first;
|
||||
auto AliaseeGUID =
|
||||
getValueInfoFromValueId(AliaseeValueId).first.getGUID();
|
||||
auto AliaseeInModule =
|
||||
TheIndex.findSummaryInModule(AliaseeGUID, AS->modulePath());
|
||||
if (!AliaseeInModule)
|
||||
return error("Alias expects aliasee summary to be parsed");
|
||||
AS->setAliasee(AliaseeInModule);
|
||||
|
||||
GlobalValue::GUID GUID = getGUIDFromValueId(ValueID).first;
|
||||
LastSeenGUID = GUID;
|
||||
TheIndex.addGlobalValueSummary(GUID, std::move(AS));
|
||||
ValueInfo VI = getValueInfoFromValueId(ValueID).first;
|
||||
LastSeenGUID = VI.getGUID();
|
||||
TheIndex.addGlobalValueSummary(VI, std::move(AS));
|
||||
break;
|
||||
}
|
||||
// FS_COMBINED_GLOBALVAR_INIT_REFS: [valueid, modid, flags, n x valueid]
|
||||
@@ -5193,9 +5198,9 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
|
||||
auto FS = llvm::make_unique<GlobalVarSummary>(Flags, std::move(Refs));
|
||||
LastSeenSummary = FS.get();
|
||||
FS->setModulePath(ModuleIdMap[ModuleId]);
|
||||
GlobalValue::GUID GUID = getGUIDFromValueId(ValueID).first;
|
||||
LastSeenGUID = GUID;
|
||||
TheIndex.addGlobalValueSummary(GUID, std::move(FS));
|
||||
ValueInfo VI = getValueInfoFromValueId(ValueID).first;
|
||||
LastSeenGUID = VI.getGUID();
|
||||
TheIndex.addGlobalValueSummary(VI, std::move(FS));
|
||||
break;
|
||||
}
|
||||
// FS_COMBINED_ORIGINAL_NAME: [original_name]
|
||||
|
||||
Reference in New Issue
Block a user