[llvm] r265231 - Linker: Avoid unnecessary work when moving named metadata
Duncan P. N. Exon Smith via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 2 10:39:31 PDT 2016
Author: dexonsmith
Date: Sat Apr 2 12:39:31 2016
New Revision: 265231
URL: http://llvm.org/viewvc/llvm-project?rev=265231&view=rev
Log:
Linker: Avoid unnecessary work when moving named metadata
IRLinker::mapUnneededSubprograms has to be sure that any "needed"
subprograms get linked in. Rather than traversing through imported
entities using llvm::getSubprogram, call MapMetadata. The latter
memoizes the result in the ValueMap (sharing work with
IRLinker::linkNamedMDNodes proper), and makes the local SmallPtrSet
redundant.
Modified:
llvm/trunk/lib/Linker/IRMover.cpp
Modified: llvm/trunk/lib/Linker/IRMover.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/IRMover.cpp?rev=265231&r1=265230&r2=265231&view=diff
==============================================================================
--- llvm/trunk/lib/Linker/IRMover.cpp (original)
+++ llvm/trunk/lib/Linker/IRMover.cpp Sat Apr 2 12:39:31 2016
@@ -1043,28 +1043,22 @@ void IRLinker::mapUnneededSubprograms()
for (unsigned I = 0, E = CompileUnits->getNumOperands(); I != E; ++I) {
auto *CU = cast<DICompileUnit>(CompileUnits->getOperand(I));
assert(CU && "Expected valid compile unit");
- // Ensure that we don't remove subprograms referenced by DIImportedEntity.
- // It is not legal to have a DIImportedEntity with a null entity or scope.
- // Using getDISubprogram handles the case where the subprogram is reached
- // via an intervening DILexicalBlock.
+
+ // Seed the ValueMap with the imported entities, in case they reference new
+ // subprograms.
// FIXME: The DISubprogram for functions not linked in but kept due to
// being referenced by a DIImportedEntity should also get their
// IsDefinition flag is unset.
- SmallPtrSet<DISubprogram *, 8> ImportedEntitySPs;
- for (auto *IE : CU->getImportedEntities()) {
- if (auto *SP = getDISubprogram(dyn_cast<MDNode>(IE->getEntity())))
- ImportedEntitySPs.insert(SP);
- if (auto *SP = getDISubprogram(dyn_cast<MDNode>(IE->getScope())))
- ImportedEntitySPs.insert(SP);
- }
+ if (MDTuple *IEs = CU->getImportedEntities().get())
+ (void)MapMetadata(IEs, ValueMap,
+ ValueMapperFlags | RF_NullMapMissingGlobalValues,
+ &TypeMap, &GValMaterializer);
- // Try to insert nullptr into the map for any SP not referenced from
- // functions and not in the imported entities. If the insertino succeeded,
- // set HasUnneededSPs.
+ // Try to insert nullptr into the map for any SP not already mapped. If
+ // the insertion succeeds, we don't need this subprogram.
for (auto *Op : CU->getSubprograms())
- if (!ImportedEntitySPs.count(Op))
- if (ValueMap.MD().insert(std::make_pair(Op, TrackingMDRef())).second)
- HasUnneededSPs = true;
+ if (ValueMap.MD().insert(std::make_pair(Op, TrackingMDRef())).second)
+ HasUnneededSPs = true;
}
}
More information about the llvm-commits
mailing list