mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[ThinLTO] Add a recursive step in Metadata lazy-loading
Summary: Without this, we're stressing the RAUW of unique nodes, which is a costly operation. This is intended to limit the number of RAUW, and is very effective on the total link-time of opt with ThinLTO, before: real 4m4.587s user 15m3.401s sys 0m23.616s after: real 3m25.261s user 12m22.132s sys 0m24.152s Reviewers: tejohnson, pcc Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D28751 llvm-svn: 292420
This commit is contained in:
parent
88cd0769ca
commit
acf5525670
@ -768,13 +768,12 @@ void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
|
||||
unsigned ID, PlaceholderQueue &Placeholders) {
|
||||
assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
|
||||
assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");
|
||||
#ifndef NDEBUG
|
||||
// Lookup first if the metadata hasn't already been loaded.
|
||||
if (auto *MD = MetadataList.lookup(ID)) {
|
||||
auto *N = dyn_cast_or_null<MDNode>(MD);
|
||||
assert(N && N->isTemporary() && "Lazy loading an already loaded metadata");
|
||||
if (!N->isTemporary())
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
SmallVector<uint64_t, 64> Record;
|
||||
StringRef Blob;
|
||||
IndexCursor.JumpToBit(GlobalMetadataBitPosIndex[ID - MDStringRef.size()]);
|
||||
@ -827,8 +826,22 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
|
||||
auto getMD = [&](unsigned ID) -> Metadata * {
|
||||
if (ID < MDStringRef.size())
|
||||
return lazyLoadOneMDString(ID);
|
||||
if (!IsDistinct)
|
||||
if (!IsDistinct) {
|
||||
if (auto *MD = MetadataList.lookup(ID))
|
||||
return MD;
|
||||
// If lazy-loading is enabled, we try recursively to load the operand
|
||||
// instead of creating a temporary.
|
||||
if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
|
||||
// Create a temporary for the node that is referencing the operand we
|
||||
// will lazy-load. It is needed before recursing in case there are
|
||||
// uniquing cycles.
|
||||
MetadataList.getMetadataFwdRef(NextMetadataNo);
|
||||
lazyLoadOneMetadata(ID, Placeholders);
|
||||
return MetadataList.lookup(ID);
|
||||
}
|
||||
// Return a temporary.
|
||||
return MetadataList.getMetadataFwdRef(ID);
|
||||
}
|
||||
if (auto *MD = MetadataList.getMetadataIfResolved(ID))
|
||||
return MD;
|
||||
return &Placeholders.getPlaceholderOp(ID);
|
||||
|
@ -17,7 +17,7 @@
|
||||
; RUN: -o /dev/null -disable-ondemand-mds-loading -stats \
|
||||
; RUN: 2>&1 | FileCheck %s -check-prefix=NOTLAZY
|
||||
; NOTLAZY: 58 bitcode-reader - Number of Metadata records loaded
|
||||
; NOTLAZY: 8 bitcode-reader - Number of MDStrings loaded
|
||||
; NOTLAZY: 6 bitcode-reader - Number of MDStrings loaded
|
||||
|
||||
|
||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
@ -48,7 +48,7 @@ define void @globalfunc3(i32 %arg) {
|
||||
!3 = !{!"3"}
|
||||
!4 = !{!"4"}
|
||||
!5 = !{!"5"}
|
||||
!6 = !{!"6"}
|
||||
!6 = !{!9}
|
||||
!7 = !{!"7"}
|
||||
!8 = !{!"8"}
|
||||
!9 = !{!"9"}
|
||||
!9 = !{!6}
|
||||
|
Loading…
Reference in New Issue
Block a user