|
8 | 8 |
|
9 | 9 | #include "llvm/Linker/IRMover.h" |
10 | 10 | #include "LinkDiagnosticInfo.h" |
| 11 | +#include "llvm/ADT/DenseMap.h" |
| 12 | +#include "llvm/ADT/DenseSet.h" |
11 | 13 | #include "llvm/ADT/SetVector.h" |
12 | 14 | #include "llvm/ADT/SmallString.h" |
13 | 15 | #include "llvm/IR/AutoUpgrade.h" |
@@ -290,6 +292,9 @@ class IRLinker { |
290 | 292 | Module &DstM; |
291 | 293 | std::unique_ptr<Module> SrcM; |
292 | 294 |
|
| 295 | + // Lookup table to optimize IRMover::linkNamedMDNodes(). |
| 296 | + DenseMap<StringRef, DenseSet<MDNode *>> NamedMDNodes; |
| 297 | + |
293 | 298 | /// See IRMover::move(). |
294 | 299 | IRMover::LazyCallback AddLazyFor; |
295 | 300 |
|
@@ -1132,12 +1137,20 @@ void IRLinker::linkNamedMDNodes() { |
1132 | 1137 | continue; |
1133 | 1138 |
|
1134 | 1139 | NamedMDNode *DestNMD = DstM.getOrInsertNamedMetadata(NMD.getName()); |
| 1140 | + |
| 1141 | + auto &Inserted = NamedMDNodes[DestNMD->getName()]; |
| 1142 | + if (Inserted.empty()) { |
| 1143 | + // Must be the first module, copy everything from DestNMD. |
| 1144 | + Inserted.insert(DestNMD->operands().begin(), DestNMD->operands().end()); |
| 1145 | + } |
| 1146 | + |
1135 | 1147 | // Add Src elements into Dest node. |
1136 | 1148 | for (const MDNode *Op : NMD.operands()) { |
1137 | 1149 | MDNode *MD = Mapper.mapMDNode(*Op); |
1138 | | - if (!is_contained(DestNMD->operands(), MD)) |
| 1150 | + if (Inserted.insert(MD).second) |
1139 | 1151 | DestNMD->addOperand(MD); |
1140 | 1152 | } |
| 1153 | + assert(Inserted.size() == DestNMD->getNumOperands()); |
1141 | 1154 | } |
1142 | 1155 | } |
1143 | 1156 |
|
|
0 commit comments