From 565a0aa1c4130a3e252a7d210b0f5d954644e98a Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Sun, 17 Apr 2016 23:30:31 +0000 Subject: 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 --- llvm/lib/Linker/IRMover.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'llvm/lib/Linker') 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 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 SrcM, ArrayRef ValuesToLink, + IRLinker(Module &DstM, MDMapT &SharedMDs, + IRMover::IdentifiedStructTypeSet &Set, std::unique_ptr SrcM, + ArrayRef ValuesToLink, std::function 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 Src, ArrayRef ValuesToLink, std::function 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; -- cgit v1.2.3