diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-04-17 23:30:31 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-04-17 23:30:31 +0000 |
commit | 565a0aa1c4130a3e252a7d210b0f5d954644e98a (patch) | |
tree | 9ce86373ed3d2a78ae29d8409b9dfca73afa09c3 /llvm/lib/Linker | |
parent | abf6c650ac8d20f9774787e4571f82a7ea8eb2b8 (diff) | |
download | bcm5719-llvm-565a0aa1c4130a3e252a7d210b0f5d954644e98a.tar.gz bcm5719-llvm-565a0aa1c4130a3e252a7d210b0f5d954644e98a.zip |
Linker: Share a single Metadata map for the lifetime of IRMover
Cache the result of mapping metadata nodes between instances of IRLinker
(i.e., for the lifetime of IRMover). There shouldn't be any real
functional change here, but this should give a major speedup. I had
loaned this to Mehdi when he tested performance of r266446, and the two
patches together gave a 10x speedup in metadata mapping.
llvm-svn: 266579
Diffstat (limited to 'llvm/lib/Linker')
-rw-r--r-- | llvm/lib/Linker/IRMover.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index 02fe58d2cc5..5b52ea8106e 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -362,6 +362,9 @@ public: void materializeInitFor(GlobalValue *New, GlobalValue *Old) override; }; +/// Type of the Metadata map in \a ValueToValueMapTy. +typedef DenseMap<const Metadata *, TrackingMDRef> MDMapT; + /// This is responsible for keeping track of the state used for moving data /// from SrcM to DstM. class IRLinker { @@ -375,6 +378,9 @@ class IRLinker { GlobalValueMaterializer GValMaterializer; LocalValueMaterializer LValMaterializer; + /// A metadata map that's shared between IRLinker instances. + MDMapT &SharedMDs; + /// Mapping of values from what they used to be in Src, to what they are now /// in DstM. ValueToValueMapTy is a ValueMap, which involves some overhead /// due to the use of Value handles which the Linker doesn't actually need, @@ -467,18 +473,21 @@ class IRLinker { void linkNamedMDNodes(); public: - IRLinker(Module &DstM, IRMover::IdentifiedStructTypeSet &Set, - std::unique_ptr<Module> SrcM, ArrayRef<GlobalValue *> ValuesToLink, + IRLinker(Module &DstM, MDMapT &SharedMDs, + IRMover::IdentifiedStructTypeSet &Set, std::unique_ptr<Module> SrcM, + ArrayRef<GlobalValue *> ValuesToLink, std::function<void(GlobalValue &, IRMover::ValueAdder)> AddLazyFor) : DstM(DstM), SrcM(std::move(SrcM)), AddLazyFor(AddLazyFor), TypeMap(Set), - GValMaterializer(*this), LValMaterializer(*this), + GValMaterializer(*this), LValMaterializer(*this), SharedMDs(SharedMDs), Mapper(ValueMap, RF_MoveDistinctMDs | RF_IgnoreMissingLocals, &TypeMap, &GValMaterializer), AliasMCID(Mapper.registerAlternateMappingContext(AliasValueMap, &LValMaterializer)) { + ValueMap.MD().swap(SharedMDs); for (GlobalValue *GV : ValuesToLink) maybeAdd(GV); } + ~IRLinker() { ValueMap.MD().swap(SharedMDs); } bool run(); Value *materializeDeclFor(Value *V, bool ForAlias); @@ -1350,8 +1359,8 @@ IRMover::IRMover(Module &M) : Composite(M) { bool IRMover::move( std::unique_ptr<Module> Src, ArrayRef<GlobalValue *> ValuesToLink, std::function<void(GlobalValue &, ValueAdder Add)> AddLazyFor) { - IRLinker TheIRLinker(Composite, IdentifiedStructTypes, std::move(Src), - ValuesToLink, AddLazyFor); + IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes, + std::move(Src), ValuesToLink, AddLazyFor); bool RetCode = TheIRLinker.run(); Composite.dropTriviallyDeadConstantArrays(); return RetCode; |