diff options
author | Mingming Liu <mingmingl@google.com> | 2024-07-03 13:15:17 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-03 13:15:17 -0700 |
commit | af784a5c13328aa4a8ce622260563b459856a8d4 (patch) | |
tree | ce57d8b6b8891f7ea5478076a715b3ff248cb2b7 /llvm/lib/LTO/LTO.cpp | |
parent | 873c3f7e7813223906d3ebf5acb4359a8b5726bc (diff) | |
download | llvm-af784a5c13328aa4a8ce622260563b459856a8d4.zip llvm-af784a5c13328aa4a8ce622260563b459856a8d4.tar.gz llvm-af784a5c13328aa4a8ce622260563b459856a8d4.tar.bz2 |
[ThinLTO] Use a set rather than a map to track exported ValueInfos. (#97360)
https://github.com/llvm/llvm-project/pull/95482 is a reland of
https://github.com/llvm/llvm-project/pull/88024.
https://github.com/llvm/llvm-project/pull/95482 keeps indexing memory
usage reasonable by using unordered_map and doesn't make other changes
to originally reviewed code.
While discussing possible ways to minimize indexing memory usage, Teresa
asked whether I need `ExportSetTy` as a map or a set is sufficient. This
PR implements the idea. It uses a set rather than a map to track exposed
ValueInfos.
Currently, `ExportLists` has two use cases, and neither needs to track a
ValueInfo's import/export status. So using a set is sufficient and
correct.
1) In both in-process and distributed ThinLTO, it's used to decide if a
function or global variable is visible [1] from another module after importing
creates additional cross-module references.
* If a cross-module call edge is seen today, the callee must be visible
to another module without keeping track of its export status already.
For instance, this [2] is how callees of direct calls get exported.
2) For in-process ThinLTO [3], it's used to compute lto cache key.
* The cache key computation already hashes [4] 'ImportList' , and 'ExportList' is
determined by 'ImportList'. So it's fine to not track 'import type' for export list.
[1] https://github.com/llvm/llvm-project/blob/66cd8ec4c08252ebc73c82e4883a8da247ed146b/llvm/lib/LTO/LTO.cpp#L1815-L1819
[2] https://github.com/llvm/llvm-project/blob/66cd8ec4c08252ebc73c82e4883a8da247ed146b/llvm/lib/LTO/LTO.cpp#L1783-L1794
[3] https://github.com/llvm/llvm-project/blob/66cd8ec4c08252ebc73c82e4883a8da247ed146b/llvm/lib/LTO/LTO.cpp#L1494-L1496
[4] https://github.com/llvm/llvm-project/blob/b76100e220591fab2bf0a4917b216439f7aa4b09/llvm/lib/LTO/LTO.cpp#L194-L222
Diffstat (limited to 'llvm/lib/LTO/LTO.cpp')
-rw-r--r-- | llvm/lib/LTO/LTO.cpp | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index 6bbec53..5382b11 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -161,19 +161,17 @@ void llvm::computeLTOCacheKey( auto ModHash = Index.getModuleHash(ModuleID); Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash))); - std::vector<std::pair<uint64_t, uint8_t>> ExportsGUID; + // TODO: `ExportList` is determined by `ImportList`. Since `ImportList` is + // used to compute cache key, we could omit hashing `ExportList` here. + std::vector<uint64_t> ExportsGUID; ExportsGUID.reserve(ExportList.size()); - for (const auto &[VI, ExportType] : ExportList) - ExportsGUID.push_back( - std::make_pair(VI.getGUID(), static_cast<uint8_t>(ExportType))); + for (const auto &VI : ExportList) + ExportsGUID.push_back(VI.getGUID()); // Sort the export list elements GUIDs. llvm::sort(ExportsGUID); - for (auto [GUID, ExportType] : ExportsGUID) { - // The export list can impact the internalization, be conservative here + for (auto GUID : ExportsGUID) Hasher.update(ArrayRef<uint8_t>((uint8_t *)&GUID, sizeof(GUID))); - AddUint8(ExportType); - } // Include the hash for every module we import functions from. The set of // imported symbols for each module may affect code generation and is |