[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